Necesita asesoramiento sobre manejo de colisiones

Estoy haciendo un juego en 2D, nada lujoso, con objetos (llamados entidades de ahora en adelante) que deberían chocar entre sí y con el terreno. Ahora, detectar colisión no es el problema, el problema es cuando las entidades colisionan con el terreno.

Tengo un .png simple, al cargar el juego reviso todos los píxeles de esta imagen y agrego todos los negros a una lista, estos son los píxeles que pueden colisionarse.

Código de colisión de la clase Entity:

    int ceiling = Integer.MAX_VALUE;
    int floor = 0;
    int rightPoint = 0;
    int leftPoint = Integer.MAX_VALUE;

    for(Point p : main.terrain.points)
        if(getHypoRect().contains(p))
        {
            if(p.x > rightPoint && right)
                rightPoint = p.x;
            if(p.x < leftPoint && left)
                leftPoint = p.x;
            if(p.y < ceiling && up)
                ceiling = p.y;
            if(p.y > floor && down)
                floor = p.y;
        }
    if(rightPoint != 0)
        xCoord = rightPoint - sprite.getImage().getWidth();
    else if(right)
        xCoord+=speed;

    if(leftPoint != Integer.MAX_VALUE)
        xCoord = leftPoint;
    else if(left)
        xCoord-=speed;

    if(ceiling != Integer.MAX_VALUE)
        yCoord = ceiling;
    else if(up)
        yCoord-=speed;

    if(floor != 0)
        yCoord = floor - sprite.getImage().getHeight();
    else if(down)
        yCoord+=speed;

En el bucle for, paso por todos los puntos (píxeles negros) en el terreno, luego verifico si el cuadro de colisión de la Entidad los contiene (la velocidad se agrega en este método, o más bien se agrega "hipotéticamente", por eso tiene el nombre extraño). Ahora, si el valor x del punto es mayor que el "punto derecho", y si la Entidad está caminando hacia la derecha, se sobrescribe. Lo mismo sucede con leftPoint (punto "izquierdo"), techo y piso. Luego verifico si alguno de estos puntos ha cambiado, si lo han hecho, eso significa que colisionamos con el terreno, por lo que los recuperamos. Por ejemplo, digamos que la Entidad está caminando hacia la derecha y chocamos con el terreno, rightPoint se ha escrito con el "más correcto"

Si uno fuera solo en una dirección a la vez, esto funcionaría perfectamente, pero suceden cosas "extrañas" cuando se tienen en cuenta múltiples entradas.

Ejemplo: la Entidad camina, plana hacia el piso, hacia una repisa a la derecha, cuando la Entidad está a medio camino sobre la repisa, quiere bajar, por lo que se presionan tanto hacia la derecha como hacia abajo, lo que mi código hará es verificar las entradas , coloque la Entidad donde quiere estar y luego devuélvala si golpea el terreno, así verá que presiono a la derecha y la devuelvo al final de la repisa.

Esta es mi propia idea de cómo podría funcionar la terraincollision, no pude encontrar nada en línea, excepto cómo verificar si se produjo una colisión, pero nada que lo cubra. ¿Alguna idea de lo que podría hacer que mi solución funcione, o un indicador de cómo se debe hacer la terraincollision?

Respuesta 1

He leído que un método estático no puede llamar a un método no estático, pero esta compilación, el método principal (estático) llama quizás Método nuevo (no estático), ¿puede darme una pista? clase pública Mix4 {int counter ...

Estoy tratando de configurar VSCode como un entorno de desarrollo Java para el proyecto Java en el que estoy trabajando en el trabajo. He instalado los complementos recomendados para esta lista aquí, pero mi proyecto usa Lombok para ...

Tengo una variable de cadena básica que contiene la letra x un total de tres veces. Intenté encontrar x dentro de la Cadena usando charAt, y luego imprimí el char y los siguientes dos caracteres al lado de ...

Al ejecutar AEM 6.5.3 en Java 11, noté mensajes WARN sospechosos que aparecían en error.log de vez en cuando: 08.01.2020 16: 33: 06.236 WARN [10.0.2.2 [1578497585926] GET /editor.html/content/* HTTP / 1 ....