PDA

Просмотр полной версии : скорость проигрывание анимации


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
Ниче не понял

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
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
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.