Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   скорость проигрывание анимации (http://www.flasher.ru/forum/showthread.php?t=177852)

anmelegov 10.04.2012 12:24

скорость проигрывание анимации
 
в общем у меня есть анимация персонажа на таймере... я хочу чтобы скорость проигрывания анимации зависела от скорости бега. Первое что пришло в голову - это задавать таймеру задержку, в зависимости от длины вектора скорости. Но через 3-5 секунд у таймера перестает срабатывать таймерИвент... как сделать по другому или так чтобы таймер не "ломался"?

Dukobpa3 10.04.2012 13:03

Цитата:

задавать таймеру задержку, в зависимости от длины вектора скорости
Ниче не понял

gloomyBrain 10.04.2012 13:06

Проще слушать событие Event.ENTER_FRAME и считатать кадры. Если скорость бега такая-то, значит мы должны переключать кадр анимации раз в столько-то событий ENTER_FRAME.

anmelegov 10.04.2012 13:09

Цитата:

Сообщение от Dukobpa3 (Сообщение 1074081)
Ниче не понял

Код AS3:

timer.delay = k / velocity.length


Dukobpa3 10.04.2012 13:12

Цитата:

timer.delay = k / velocity.length
Спасибо кеп, элементарную математику понимаю, а что такое "длина вектора скорости"?

anmelegov 10.04.2012 13:14

velocity.length - это длина вектора скорости... человечек бежит с определенной скоростью, длина вектора скорости = это расстояние которое он пробежит за момент времени

Dukobpa3 10.04.2012 13:19

Посмотри любой твинер, как там сделано.
Поидее таки лучше делать по ентерфрейму, а таймером мерять задержку после предыдущего кадра, и расчитывать исходя из этой задержки на какое расстояние он сместится в этом кадре.
Т.е. твой вариант с точностью до наоборот.

Тупо по таймеру не получится так как флешка все-равно работает по кадрам, и если таймер срабатывает между кадрами или же интервал таймера меньше одного-двух кадров - то будут косяки. Таймером можно пользоваться если задержка в районе 100-1000 мс(10-1 тик в секунду), у меня обычно нету таймеров меньше 100 мс, чаще всего вообще только секундные.

anmelegov 10.04.2012 13:22

с таймером классно работает до тех пор пока я не начинаю менять delay каждую секунду, потом что-то нарушается

Dukobpa3 10.04.2012 13:25

Ну ты сам всё знаешь, зачем тогда спрашивать.

Aquahawk 10.04.2012 13:29

Дело в том что события таймера всё равно привязаны к общей частоте кадров. Вы не сможете перерисовать человечка посередине кадра. Поэтому лучшим решением будет сидеть на EnterFrame и мерять время по getTimer(). Время мерять надо потому что на разных компах и разной нагрузке некоторые кадры могут рендериться дольше чем обычно. И как только вы видите что подошло время нарисовать следующий кадр вы его переключаете.

anmelegov 10.04.2012 13:32

Код AS3:

private var skipCount:uint = 3;
private function animate(event:Event):void {
  if(skipCount) skipCount-- else {
    ..draw..
    skipCount = 3;
  }
}

Добавлено через 1 минуту
там такая графика что на любом компе фпс будет 24 =)

-De- 10.04.2012 13:48

Код AS3:

private var currentCadr:Number = 0;
private var currentCadrInt:int = 0;
private function animate(event:Event):void {
  currentCadr += velocity.length / k;//лучше, чтоб, как советует Aquahawk, k пропорционально зависело от времени прошедшего с прошлого кадра.
  while(currentCadr > AnimCadresTotal)
    currentCadr  -= AnimCadresTotal;
  if(int(currentCadr) != currentCadrInt) {
    currentCadrInt = int(currentCadr);
    //рисуем кадр currentCadrInt + 1
  }
}


anmelegov 10.04.2012 14:08

не понимаю ваш код... мне кажется у него только 1 итерация сработает или не?...

-De- 10.04.2012 14:18

Это же ВАШ код из поста выше, изменённый только.
animate - это слушатель ENTER_FRAME.


Часовой пояс GMT +4, время: 03:24.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.