// Escala la velocidad para calcular cuanto se avanza en este frame (para mayor precisión)
velocity.scl(dt);
// Para el chequeo de colisiones
int startX, endX, startY, endY;
Rectangle rect = rectPool.obtain();
rect.set(position.x, position.y, 18, 28);
// Comprueba las colisiones con tiles en el eje Y (he quitado + velocity.y en startY, endY)
// El enemigo está saltando
if (velocity.y > 0)
startY = endY = (int) (position.y + HEIGHT + velocity.y);
// El enemigo cae o está parado (no se tiene en cuenta su altura)
else
startY = endY = (int) (position.y + velocity.y);
startX = (int) position.x;
endX = (int) (position.x + WIDTH);
// Obtiene la lista de tiles que ocupan la posición del enemigo
getTilesPosition(startX, startY, endX, endY, tiles);
rect.y += velocity.y;
for (Rectangle tile : tiles) {
if (tile.overlaps(rect)) {
if (velocity.y > 0) {
position.y = tile.y - HEIGHT;
}
else {
position.y = tile.y + tile.height;
}
velocity.y = 0;
break;
}
}
// Comprueba las colisiones con tiles en el eje X (he quitado + velocity.x en startX, endX)
// El enemigo se desplaza hacia la derecha
if (velocity.x > 0)
startX = endX = (int) (position.x + WIDTH + velocity.x);
// El enemigo se desplaza hacia la izquierda (no se tiene en cuenta la anchura del enemigo)
else
startX = endX = (int) (position.x + velocity.x);
startY = (int) position.y;
endY = (int) (position.y + HEIGHT);
// Obtiene la lista de tiles que ocupan la posición del enemigo
getTilesPosition(startX, startY, endX, endY, tiles);
rect.x += velocity.x;
for (Rectangle tile : tiles) {
if (rect.overlaps(tile)) {
faceLeft = !faceLeft;
velocity.x = 0;
break;
}
}