Используя Java, как я могу построить путь спрайта по прямой линии? - PullRequest
0 голосов
/ 13 апреля 2010

Для иллюстрации у меня сейчас есть что-то вроде

int startX,endX,currX;
int startY,endY,currY;

public void updatePos(){

if(currX<=endX){
   currX+=1;
}
//Same for y

Я вижу, что не хочу каждый раз перемещать x и y по одной и той же величине, но не знаю, как определить, что мне следует делать, чтобы определить, сколько нужно отрегулировать.

Любые идеи

Может быть, это поможет уточнить

Представь, что я начинаю с этих координат (0,0) и я хочу добраться до (18,10)

если я увеличиваю свои x и y до тех пор, пока они не достигнут желаемой цели на шаг один, спрайт перемещается по диагонали вверх, затем по экрану вправо, прежде чем покоится в правильном положении.

Мне нужно поведение, состоящее в том, что оно движется в одном направлении к точке назначения (если хотите, вдоль треугольника)

Я ищу предложения о том, как найти свой следующий набор баллов

Ответы [ 3 ]

2 голосов
/ 13 апреля 2010

Если T - это время, необходимое для перехода от X0, Y0 к X1, Y1, положение в любой данный момент времени t (0 <= t <= T) составляет: </p>

X = X0 + t*(X1-X0)/T
Y = Y0 + t*(Y1-Y0)/T
1 голос
/ 13 апреля 2010

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

0 голосов
/ 13 апреля 2010

Обычно у вас будет необходимая скорость для вашего спрайта, и вы будете обновлять его позицию на основе его скорости и времени, прошедшего с момента последнего обновления, например,

public class MySprite {
  int x, y; // Location
  int dx, int dy; // Velocity in pixels / millisecond

  public void updatePosition(long deltaMillis) {
    // Update x and y position based on current velocity.
    x += dx * deltaMillis;
    y += dy * deltaMillis;
  }
}

В зависимости от скорости вашей машины ваш цикл анимации будет выполняться быстрее или медленнее. Однако, поскольку ваши обновления основаны на предварительно заданной скорости, это не повлияет на скорость движения спрайта по экрану.

public void animationLoop() {
  long prev = System.currentTimeMillis();; 
  long now;
  long deltaMillis;

  while (animationRunning) {
    // Record ellapsed time.
    now = System.currentTimeMillis();
    deltaMillis = now - prev;
    prev = now;

    if (deltaMillis > 0L) { // Some time has passed so move sprite.
      sprite.updatePosition(deltaMillis);
    }

    // TODO: Repaint sprite.
  }
}
...