![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Здравствуйте, казалось бы глупый вопрос, но загнал меня в ступор. Фреймрейт приложения 25 кадр/сек. Есть мувиклип человечка, в кадрах которого движение (перемещаются руки и ноги - типа идет). По клику этот чувак перемещается из точки А в точку Б с постоянной скоростью. Но необходимо сделать фичу чтобы пользователь мог сам настраивать скорость человечка перед началом каждого движения. Как думаю я:
1. Движение по enterFrame. Сдвигать обьект на некоторое расстояние, зависящее от framerate и вызывать nextFrame() человечка. Скорость постоянная - плавная, обьект перебирает ногами плавно. Если пользователь удваивает скорость - изменяю framerate на 50. То же самое, но обьект перемещается в пространстве в 2 раза быстрее и перебирает ногами в два раза быстрее. Но такой высокий framerate для приложения нежелателен. Анимации много - может тупить. 2. Движение по timer. Запускаю таймер со скорость 25 раз/сек. В каждой итерации сдвигаю обьект на некоторое расстояние и вызываю nextFrame() обьекта. Скорость постоянная - плавная, обьект перебирает ногами плавно. Если пользователь удваивает скорость - изменяю скорость таймера на 50 р/сек. Но здесь проблема - framerate в два раза ниже. Пока произойдет перерисовка кадра - nextFrame() человечка выполнится два раза и обьект переместится на два отрезка. И пользователь не увидит промежуточные кадры человечка, а увидит рывки. Подскажите, пожалуйста, может есть третий способ, как лучше здесь поступить?
__________________
Я мало чего умею, но зато хорошо умею учиться... |
|
|||||
|
Управление анимацией персонажа - отдельный интерфейс. При значительном увеличении скорости (в кратное или близкое ему значение: х2, х3, х4...) - перепрыгивать через кадры соответственно кратности.
А движение самого объекта - хоть enter_frame-ом, хоть твинером, не принципиально.
__________________
Ну все, теперь Забава м-о-я. Гы-гы, а корабль мой! |
|
|||||
|
А как эту частоту изменить? Ведь пользователь не увидит изменения, пока не произойдет перерисовка. Или, вы имеете в виду: запустив таймер в два раза быстрее чем фреймрейт и в каждой итерации изменять картинку (например nextFrame) и вызывать updateAfterEvent(). Но тогда, как бы там ни было - частота кадров все равно ускорится в двое, потому что кадр будет выполнятся не по enterFrame, а по updateAfterEvent().
__________________
Я мало чего умею, но зато хорошо умею учиться... |
|
|||||
|
Картинка по определению не должна перерисовываться чаще, чем фрэймрэйт самого приложения, который нет смысла выставлять выше 31 (я обычно ставлю 30). Т.е. возможно только урежение смены картинки. Происходить это будет на основе кадров мувиклипов или сиквенции изображений не принципиально.
Допустим имеем дело с мувиками и покадровой анимацией. К примеру необходимо проиграть анимацию в 3 раза реже. Экземпляр класса персонажа должен иметь какой-то метод, типа Т.е. при передаче ему нового кадра он устанавливает точку воспроизведения в соответствующую позицию, если таковая не соответствует настоящему положению. В отношении передачи такого параметра все еще проще. По ENTER_FRAME-у (или таймеру) делаем инкремент некоей переменной, которую передаем в качестве аргумента методу update вашего персонажа. Инкремент будет зависеть от кртаности. Т.е. если необходимо замедлить скорость проигрывания анимации в 3 раза, то выглядеть будет примерно так: Upd. Тут подумал, что пожалуй значение _frameIndex сделать геттреом внутри _person, таким образом можно сделать скорость воспроиззведения у каждого подобного объекта уникальной, соответственно интерфейс упростится и аргумент метода update перестанет быть нужным. Вот как-то так.
__________________
Ну все, теперь Забава м-о-я. Гы-гы, а корабль мой! |
|
|||||
|
Спасибо, с этим проблем нет. Такая задача легко решается. Просто из ваших слов:
Цитата:
![]()
__________________
Я мало чего умею, но зато хорошо умею учиться... |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:52. |
|
|
« Предыдущая тема | Следующая тема » |
|
|