Из вашего комментария я предполагаю, что «объекту будет очень легко сбросить несколько пикселей через некоторое время», что ключевой вопрос, который у вас есть, заключается в том, как регулярно обновлять положение объекта, чтобы он следовал по пути между двумя точками. Если вы просто обновляете его каждый раз на одну и ту же сумму, то, как вы говорите, он вряд ли окажется в конечной точке.
Самый простой способ сделать это — использовать переменную, которая представляет, как далеко по пути прошел объект. Алгоритм может очень быстро пересчитать правильное положение.
Например:
class Position {
private final int x;
private final int y;
public Position(int x, int y) {
this.x = x;
this.y = y;
}
public static Position interpolatedPosition(Position from, Position to, float progress) {
return new Position(
from.x + Math.round(progress * (to.x - from.x)),
from.y + Math.round(progress * (to.y - from.y)));
}
}
Вы можете довольно легко расширить это, чтобы обеспечить постоянную скорость, разделив progress
на расстояние в вызове. Или вы можете поддерживать движение по пути, создав класс со списком позиций и сохраненным прогрессом.
class Path {
private final List<Position> positions = new ArrayList<>();
private int currentPosition = 0;
private float progress = 0.0f;
private float speed = 0.1f;
public void addPosition(Position position) {
positions.add(position);
}
public void update() {
progress += speed;
while (progress > 1.0f) {
currentPosition = nextPosition();
progress -= 1.0f;
}
}
public Position getCurrentPosition() {
return Position.interpolatedPosition(positions.get(currentPosition), positions.get(nextPosition()), progress);
}
private int nextPosition() {
return (currentPosition + 1) % positions.size();
}
}
Вторая часть вашего вопроса заключается в том, как заранее определить этот путь, обходя множество препятствий. Ответ на этот вопрос зависит от множества факторов, в частности от того, насколько оптимальным должно быть решение и насколько эффективным должен быть алгоритм поиска. Однако простых путей не существует — общий поиск пути — непростая область. В зависимости от вашего приложения самым простым решением может быть простое определение путей самостоятельно, если вы уже знаете макет карты.
person
sprinter
schedule
17.08.2015