Координатное путешествие по многолинейному маршруту за прошедшее время - PullRequest
0 голосов
/ 21 июня 2011

Я реализовал A * Поиск пути, чтобы определить ход спрайта через несколько точек маршрута. Я сделал это для точек А в точках В, но у меня возникли проблемы с несколькими путевыми точками, потому что на более медленных устройствах, когда FPS замедляется и спрайт перемещается ПОСЛЕ путевой точки, я теряюсь в математике, чтобы переключать направления в нужном месте.

РЕДАКТИРОВАТЬ: Чтобы прояснить мой код поиска пути отдельно в игровом потоке, этот метод onUpdate находится в классе, подобном спрайту, который происходит в потоке пользовательского интерфейса для обновления спрайта. Чтобы быть еще более ясным, путь обновляется только тогда, когда объекты блокируют карту, в любой заданной точке текущий путь может измениться, но это не должно влиять на структуру алгоритма, если я не ошибаюсь. Я верю, что все компоненты хорошо продуманы и точны, кроме этой части: -)

Вот сценарий:

public void onUpdate(float pSecondsElapsed)
{
    // this could be 4x speed, so on slow devices the travel moved between
    // frames could be very large. What happens with my original algorithm
    // is it will start actually doing circles around the next waypoint..
    pSecondsElapsed *= SomeSpeedModificationValue;

    final int spriteCurrentX = this.getX();
    final int spriteCurrentY = this.getY();

    // getCoords contains a large array of the coordinates to each waypoint.
    // A waypoint is a destination on the map, defined by tile column/row. The
    // path finder converts these waypoints to X,Y coords.
    //
    // I.E:
    // Given a set of waypoints of 0,0 to 12,23 to 23, 0 on a 23x23 tile map, each tile
    // being 32x32 pixels. This would translate in the path finder to this:
    //    -> 0,0 to 12,23
    //        Coord : x=16 y=16
    //        Coord : x=16 y=48
    //        Coord : x=16 y=80
    //          ...
    //        Coord : x=336 y=688
    //        Coord : x=336 y=720
    //        Coord : x=368 y=720
    //
    //    -> 12,23 to 23,0 -NOTE This direction change gives me trouble specifically
    //        Coord : x=400 y=752
    //        Coord : x=400 y=720
    //        Coord : x=400 y=688
    //          ...
    //        Coord : x=688 y=16
    //        Coord : x=688 y=0
    //        Coord : x=720 y=0
    //
    // The current update index, the index specifies the coordinate that you see above
    // I.E. final int[] coords = getCoords( 2 ); -> x=16 y=80
    final int[] coords = getCoords( ... );

    // now I have the coords, how do I detect where to set the position? The tricky part
    // for me is when a direction changes, how do I calculate based on the elapsed time
    // how far to go up the new direction... I just can't wrap my head around this.

    this.setPosition(newX, newY);
}

1 Ответ

0 голосов
/ 21 июня 2011

Я бы предложил взять код поиска пути из из onUpdate() и обновить его, ну отдельно.onUpdate() будет просто воздействовать на позицию во время обновления, в то время как фактические вычисления для текущих позиций будут происходить в другом месте с большей скоростью.Это, вероятно, потребовало бы многопоточности.

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

...