Воспроизведение листа спрайта на холсте медленнее, чем частота кадров

У меня есть рендерер спрайтов, который сообщает моему игровому движку, как визуализировать спрайт. Метод обновления в этом классе вызывается по поводу 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;
                }
            }
        }

    }

}
Другие вопросы по тегам