Эффективные методы обнаружения столкновений на больших расстояниях? - PullRequest
0 голосов
/ 14 января 2019

Я реализовал базовое обнаружение столкновений в моей 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();

Я надеялся, что это безупречно помешает игроку перейти на сплошную плитку, но у него, очевидно, есть проблемы. Я не силен в столкновениях, но готов попробовать что угодно. Иногда он пропускает плитки и / или застревает.

...