PDA

Просмотр полной версии : Как реализовать движение обьекта с настройкой его скорости


HardCoder
28.01.2012, 22:49
Здравствуйте, казалось бы глупый вопрос, но загнал меня в ступор. Фреймрейт приложения 25 кадр/сек. Есть мувиклип человечка, в кадрах которого движение (перемещаются руки и ноги - типа идет). По клику этот чувак перемещается из точки А в точку Б с постоянной скоростью. Но необходимо сделать фичу чтобы пользователь мог сам настраивать скорость человечка перед началом каждого движения. Как думаю я:
1. Движение по enterFrame.
Сдвигать обьект на некоторое расстояние, зависящее от framerate и вызывать nextFrame() человечка. Скорость постоянная - плавная, обьект перебирает ногами плавно. Если пользователь удваивает скорость - изменяю framerate на 50. То же самое, но обьект перемещается в пространстве в 2 раза быстрее и перебирает ногами в два раза быстрее. Но такой высокий framerate для приложения нежелателен. Анимации много - может тупить.
2. Движение по timer.
Запускаю таймер со скорость 25 раз/сек. В каждой итерации сдвигаю обьект на некоторое расстояние и вызываю nextFrame() обьекта. Скорость постоянная - плавная, обьект перебирает ногами плавно. Если пользователь удваивает скорость - изменяю скорость таймера на 50 р/сек. Но здесь проблема - framerate в два раза ниже. Пока произойдет перерисовка кадра - nextFrame() человечка выполнится два раза и обьект переместится на два отрезка. И пользователь не увидит промежуточные кадры человечка, а увидит рывки.
Подскажите, пожалуйста, может есть третий способ, как лучше здесь поступить?

TanaTiX
28.01.2012, 22:59
Управление анимацией персонажа - отдельный интерфейс. При значительном увеличении скорости (в кратное или близкое ему значение: х2, х3, х4...) - перепрыгивать через кадры соответственно кратности.
А движение самого объекта - хоть enter_frame-ом, хоть твинером, не принципиально.

HardCoder
28.01.2012, 23:15
Спасибо. Перекурив - понял, что без изменения фреймрейта нельзя прокрутить анимацию, не схавав некоторые кадры...

TanaTiX
29.01.2012, 00:02
менять фрэймрэйт - плохая идея, а вот менять частоту обновления картинки нужных объектов (персонажей) - самое то будет

HardCoder
29.01.2012, 00:20
менять фрэймрэйт - плохая идея, а вот менять частоту обновления картинки нужных объектов (персонажей) - самое то будет
А как эту частоту изменить? Ведь пользователь не увидит изменения, пока не произойдет перерисовка. Или, вы имеете в виду: запустив таймер в два раза быстрее чем фреймрейт и в каждой итерации изменять картинку (например nextFrame) и вызывать updateAfterEvent(). Но тогда, как бы там ни было - частота кадров все равно ускорится в двое, потому что кадр будет выполнятся не по enterFrame, а по updateAfterEvent().

TanaTiX
29.01.2012, 01:49
Картинка по определению не должна перерисовываться чаще, чем фрэймрэйт самого приложения, который нет смысла выставлять выше 31 (я обычно ставлю 30). Т.е. возможно только урежение смены картинки. Происходить это будет на основе кадров мувиклипов или сиквенции изображений не принципиально.

Допустим имеем дело с мувиками и покадровой анимацией. К примеру необходимо проиграть анимацию в 3 раза реже.

Экземпляр класса персонажа должен иметь какой-то метод, типа
function update(frame:uint):void;
Т.е. при передаче ему нового кадра он устанавливает точку воспроизведения в соответствующую позицию, если таковая не соответствует настоящему положению.
В отношении передачи такого параметра все еще проще. По ENTER_FRAME-у (или таймеру) делаем инкремент некоей переменной, которую передаем в качестве аргумента методу update вашего персонажа. Инкремент будет зависеть от кртаности. Т.е. если необходимо замедлить скорость проигрывания анимации в 3 раза, то выглядеть будет примерно так:
private function onAnimationFrameChange(e:Event):void{
_currentFrame+=_frameIndex;// значение _frameIndex - и есть показатель кратности
_person.update(_currentFrame);//тут можно циклом, если таких объектов много

}

Upd. Тут подумал, что пожалуй значение _frameIndex сделать геттреом внутри _person, таким образом можно сделать скорость воспроиззведения у каждого подобного объекта уникальной, соответственно интерфейс упростится и аргумент метода update перестанет быть нужным. Вот как-то так.

HardCoder
29.01.2012, 02:11
Спасибо, с этим проблем нет. Такая задача легко решается. Просто из ваших слов: менять фрэймрэйт - плохая идея, а вот менять частоту обновления картинки нужных объектов (персонажей) - самое то будетпонял, что вы имеете в виду как-то, не перескакивая несколько кадров, воспроизвести с низнким фреймрейтом анимацию быстро:)