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();