2016-09-30 4 views
0

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

    } 

} 
+0

Довольно близко, 'this.currentTime + = 0,01;' в моем случае должен быть 'this.currentTime + = Time.deltaTime;' 'this.udateTime' будет' duration'. Установка моей продолжительности на «1», она играет 1 кадр в секунду, что ближе, чем было. –

+0

Да, я собирался обновить свой ответ, чтобы рассчитать время, которое нужно добавить в секунду и сколько времени это займет. –

+0

Ближе! Мой, если теперь выглядит так: if (this.currentTime> duration * Time.deltaTime) 'my' deltaTime' около '0,008'. Это все еще немного быстро. Если я установил продолжительность до 5, это примерно 1 секунда ... –