Воспроизведение листа спрайта на холсте медленнее, чем частота кадров
У меня есть рендерер спрайтов, который сообщает моему игровому движку, как визуализировать спрайт. Метод обновления в этом классе вызывается по поводу 120
раз в секунду. Пробежать спрайт-лист на такой скорости слишком быстро.
В моем классе спрайта у меня есть свойство duration
, который сообщает рендереру, сколько секунд должен играть спрайт. Как только он достиг последнего кадра, он должен начаться заново.
Я не совсем уверен, как рассчитать это с update
это работает 120
раз в секунду, и лист спрайта, который должен длиться x
секунд, пока это не начнется снова.
class SpriteRenderer extends Component {
// The current frame
public frame: number = 0;
// The sprite reference
public sprite: Sprite = null;
update() {
// Number of frames in the sprite sheet
let frames = this.sprite.frames;
if (frames > 0) {
// The time in seconds the sprite sheet should play
let duration = this.sprite.duration;
if (/* What should go here? */) {
this.frame++;
if (this.frame > frames - 1) {
this.frame = 0;
}
}
}
}
}
1 ответ
Вы могли бы реализовать переменную времени, которая контролирует время кадра. Эта переменная является плавающей, и как только она станет достаточно большой, вы можете сделать следующий кадр и сбросить переменную.
Я никогда не делал сценарии любого типа, но это может сработать. По крайней мере, это даст вам представление о том, о чем я говорю.
Если обновление выполняется 120 раз каждую секунду, это означает, что оно запускается каждые 60/120 секунд 0,5.
Теперь мы можем увеличить currentTime
на 0,5 и проверьте, currentTime
> sprite.duration
*60 Я думаю.:)
Exampe:
class SpriteRenderer extends Component {
// The current frame
public frame: number = 0;
// The sprite reference
public sprite: Sprite = null;
public currentTime: number = 0.0; //This is the current time.
public updateTime: number = this.sprite.duration*60; //This is how long the update time is.
update() {
this.currentTime += 0.5; //Add to the current time.
// Number of frames in the sprite sheet
let frames = this.sprite.frames;
if (frames > 0) {
// The time in seconds the sprite sheet should play
let duration = this.sprite.duration;
if (this.currentTime > this.sprite.duration*60) { //Check if the current time is more than the wait time.
this.currentTime = 0.0; //Reset the wait time.
this.frame++;
if (this.frame > frames - 1) {
this.frame = 0;
}
}
}
}
}