У меня есть 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 пикселей.
Есть ли у них какой-либо способ точно симулировать ускорение объекта с учетом частоты кадров?
Заранее спасибо.