Вычисление независимого от фрейма ускорения в ActionScript 3 - PullRequest
0 голосов
/ 17 января 2012

У меня есть 2D-игра с боковой прокруткой (сделанная с помощью ActionScript 3), которая работает со скоростью 60 кадров в секунду.Я пытаюсь сделать его независимым от частоты кадров, чтобы он работал на более медленных устройствах.

Для этого я создаю переменную с именем timeElapsed, вычисляя, сколько миллисекунд прошло между каждым кадром, и деля ее на 16(60 кадров в секунду - это около 16 мс, я думаю.) Таким образом, при 60 кадрах в секунду результат будет около 1. Тогда я раз в любое время связываю переменные с этим числом (например, player.x = speed * timeElapsed;). Это код:

private var oldTime          :Number;
private var defaultFrameRate :uint = 16; // the default frame rate in milliseconds
private var timeElapsed      :Number;

...

var newTime      :Number = getTimer();
var timePassed   :Number = newTime - this.oldTime;

this.timeElapsed = timePassed / this.defaultFrameRate;
this.oldTime     = newTime;

Проблема в том, что когда я пытаюсь применить это в ситуации, в которой объект движется быстрее, каждый кадр, я получаю эту проблему:

Это код, который вызывает проблему (я изменил егонемного для этого примера):

private var speed        :Number = 100;
private var acceleration :Number =  10;

...

this.speed += (this.acceleration * this.timeElapsed);
this.x     += this.speed * this.timeElapsed;

Проблема в том, что это (не реальные значения, просто пример):

At 60 FPS:
frame 1: speed = 110; player.x = 110;
frame 2: speed = 120; player.x = 230;
frame 3: speed = 130; player.x = 360;
frame 4: speed = 140; player.x = 500;

At 30 FPS (At half the frame rate but the same ammount of real time):
frame 1: speed = 240; player.x = 240;
frame 2: speed = 280; player.x = 560;

Как видите, при 30 кадрах всекунд игрок перемещается дальше в том же количестве в реальном времени.Похоже, проблема в том, что при 30 кадрах в секунду в первом кадре мой текущий код не учитывает небольшую разницу в скорости между первым и вторым кадрами при 60 кадрах в секунду.Я думал о том, чтобы получить среднее значение скорости между любыми двумя кадрами при 60 кадрах в секунду и использовать его для вычисления более точного значения при изменении частоты кадров, но я чувствовал, что не будет работать правильно в некоторых других ситуациях, поскольку, например, при 60 кадрах в секунду этобудет перемещать игрока на 115, а не на 110 пикселей.

Есть ли у них какой-либо способ точно симулировать ускорение объекта с учетом частоты кадров?

Заранее спасибо.

1 Ответ

1 голос
/ 17 января 2012

Я не думаю, что вы должны умножать скорость на истекшее время, так как вы уже учитываете истекшее время в расчете ускорения:

this.speed += (this.acceleration * this.timeElapsed);
this.x     += this.speed;
...