Я делаю Zelda / Pokemon-esque игру в LIGBDX и пытаюсь выяснить обнаружение столкновений. Я использую Tiled Maps и у меня есть Wall Layer, который я использую для столкновения. Всякий раз, когда игрок пытается двигаться, я использую цикл for, который проверяет, столкнется ли он со стеной. По какой-то причине игрок может остановиться на одних стенах совершенно нормально, но может пробиться сквозь другие.
Движение игрока
public void MoveLeft() {
for (float i = 0; i < movespeed; i++) {
if (!M.iswallat(getPosition().getX() - 1, getPosition().getY()) ) {
getPosition().moveLeft(1, M);
UpdatePos();
} else {
break;
}
}
}
На самом деле есть 4 метода для каждого типа движения (влево, вправо, вверх и вниз). Все они функционально одинаковы, с той лишь разницей, что переменная изменяется. getPosition - это место, где хранятся данные позиции. UpdatePos перемещает Sprite и обновляет камеру. Сам MoveLeft вызывается таймером всякий раз, когда активен логический IsMovingLeft. Это логическое значение включается и выключается методами KeyDown и KeyUp в InputProcessor.
Стена в
public boolean iswallat(float x, float y) {
int xr = (int) (x / collisionLayer.getTileWidth());
int yr = (int) ( y / collisionLayer.getTileHeight());
if (collisionLayer.getCell(xr, yr) != null) {
System.out.println("Cell found at : "+ xr + "," + yr);
if (collisionLayer.getCell(xr, yr).getTile().getProperties().containsKey("blocked")) {
return true;
}
else {
System.out.println("Found but not blocked!");
return false;
}
}
else {
return false;
}
}
Я ожидаю, что игрок действительно столкнется и остановится у стен, а не пробьется.