java android libgdx sprite collision

java - libGDX-Intentando implementar la colisión entre 2 sprites



android collision (2)

lo que el título dice básicamente

Un poco de historia sobre el juego actual: el jugador siempre se está moviendo de izquierda a derecha; si se toca la pantalla, salta si se arrastra, se adelanta. Agregué un mosaico (objeto Platform) y ahora estoy tratando de hacer que mi reproductor deje de moverse si lo golpea.

El reproductor comienza en la esquina inferior izquierda de la pantalla y la plataforma está arriba a la derecha. Lo que sucede es que el jugador se detiene cuando llega al medio de la pantalla, en lugar de a la plataforma real. ¿Alguien puede echar un vistazo a mi código y ver si pueden entender por qué? Sería muy apreciado.

public class Platform extends GameObject { private Rectangle playerRect; private Rectangle platformRect; private Player player; private boolean isOverlapping; public Platform(Sprite spr) { super(spr); player = Player.getInstance(null); // Initialises the Player class (a Singleton) // Set position of sprite setxPos(getWidth() - 400); setyPos(getHeight() / 2 - 100); spr.setX(getxPos()); spr.setY(getyPos()); } public void update() { // Rectangle of Player playerRect = new Rectangle(player.getxPos(), player.getyPos(), player .getSprite().getWidth() + player.getxPos(), player.getSprite() .getHeight() + player.getyPos()); // Rectangle of Platform platformRect = new Rectangle(getxPos(), getyPos(), getSprite().getWidth() + getxPos(), getSprite().getHeight() + getxPos()); // Make Player stop moving if the two rectangles collide isOverlapping = playerRect.overlaps(platformRect); if (isOverlapping) { player.setxSpeed(0); } } }

He estado atascado en esto por un tiempo, gracias de antemano por cualquier aporte


El constructor de la clase Rectangle requiere x, y, ancho, alto

Pero estás suministrando coordenadas de esquinas opuestas a ella.

Reemplazar

// Rectangle of Player playerRect = new Rectangle(player.getxPos(), player.getyPos(), player .getSprite().getWidth() + player.getxPos(), player.getSprite() .getHeight() + player.getyPos()); // Rectangle of Platform platformRect = new Rectangle(getxPos(), getyPos(), getSprite().getWidth() + getxPos(), getSprite().getHeight() + getxPos());

con

// Rectangle of Player playerRect = new Rectangle(player.getxPos(), player.getyPos(), player.getSprite().getWidth(), player.getSprite().getHeight()); // Rectangle of Platform platformRect = new Rectangle(getxPos(), getyPos(), getSprite().getWidth(), getSprite().getHeight());

Espero que esto ayude.


es lo que puedes ver si los rectángulos están donde piensas y si el jugador se detiene colisionando o prueba algo, lo pongo en actualización pero puedes ponerlo en cualquier otro lado.

Espero que entiendas.

Clase variable

private ShapeRenderer sRDebugRectangelPlayer = new ShapeRenderer(); private ShapeRenderer sRDebugRectangelPlatform = new ShapeRenderer(); private Rectangle playerRect = new Rectangle(); private Rectangle platformRect = new Rectangle();

Tu método

public Platform(Sprite spr) { super(spr); player = Player.getInstance(null); // Initialises the Player class (a Singleton) // Set position of sprite setxPos(getWidth() - 400); setyPos(getHeight() / 2 - 100); spr.setX(getxPos()); spr.setY(getyPos()); //add // Rectangle of Player playerRect = new Rectangle(player.getxPos(), player.getyPos(), player.getSprite().getWidth(), player.getSprite().getHeight()); // Rectangle of Platform platformRect = new Rectangle(getxPos(), getyPos(), getSprite().getWidth(), getSprite().getHeight()); }

Tu método

public void update() { playerRect.setPosition(player.getxPos(), player.getyPos()); platformRect.setPosition(getxPos(), getyPos()); // Make Player stop moving if the two rectangles collide isOverlapping = playerRect.overlaps(platformRect); if (isOverlapping) { player.setxSpeed(0); } }

// añadir para prueba en actualización o dibujar

sRDebugRectangelPlayer.begin(ShapeType.Filled); sRDebugRectangelPlayer.identity(); sRDebugRectangelPlayer.rect(player.getxPos(), player.getyPos(), player.getSprite().getWidth(), player.getSprite().getHeight()); sRDebugRectangelPlayer.end();

// agregar para actualización de prueba o dibujar

sRDebugRectangelPlatform.begin(ShapeType.Filled); sRDebugRectangelPlatform.identity(); sRDebugRectangelPlatform.rect(getxPos(), getyPos(), getSprite().getWidth(), getSprite().getHeight()); sRDebugRectangelPlatform.end();