Просмотр полной версии : скорость проигрывание анимации
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 =)
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 итерация сработает или не?...
Это же ВАШ код из поста выше, изменённый только.
animate - это слушатель ENTER_FRAME.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.