Я реализовал базовое обнаружение столкновений в моей 2D-игре с прокруткой сверху вниз. Если игрок перемещается на большое расстояние, он пропускает области вокруг него, потому что обнаружение столкновений проверяет вокруг игрока после движения. Кроме того, игрок может застрять в тайлах.
Я пытался рекурсивно разрезать движение пополам, чтобы проверить, может ли оно найти меньшее количество движения, которое не заканчивается столкновением, но я не могу заставить это работать для обеих проблем. Это также вызывает ошибку StackOverflow.
В следующем коде x () представляет местоположение игрока X слева внизу. y () - это местоположение Y size - ширина и высота игрока, а prevX и curX - временные переменные. Метод плиток получает все местоположения плиток в определенном радиусе от игрока.
move(motionx, motiony);
if (x() - size()/2 < 0)x(size()/2);
if (y() - size()/2 < 0)y(size()/2);
if (x() + size()/2 > game.mapWidth * game.chunkWidth * size)x(game.mapWidth*game.chunkWidth*size - size()/2);
if (y() + size()/2 > game.mapHeight * game.chunkHeight * size)y(game.mapHeight*game.chunkHeight*size - size()/2);
float curX = x();
boolean updateX = true;
boolean updateY = true;
for (float[] tile : game.tiles((float)Math.ceil((double)size()/(double)size))) {
Tile t = game.tile(tile[0], tile[1]);
if (t == null) continue;
if (t.solid && game.collision(game.coordinate(), tile)) {
factor(1.0f - t.bounce, 1.0f - t.bounce);
x(game.prevX);
updateX = false;
if (t.solid && game.collision(game.coordinate(), tile)) {
x(curX);
updateX = true;
y(game.prevY);
updateY = false;
if (t.solid && game.collision(game.coordinate(), tile)) {
x(game.prevX);
updateX = false;
}
}
}
}
if (updateX)game.prevX = x();
if (updateY)game.prevY = y();
Я надеялся, что это безупречно помешает игроку перейти на сплошную плитку, но у него, очевидно, есть проблемы. Я не силен в столкновениях, но готов попробовать что угодно. Иногда он пропускает плитки и / или застревает.