Форум 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=174583)

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

Цитата:

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

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

TanaTiX 29.01.2012 01:49

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

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

Экземпляр класса персонажа должен иметь какой-то метод, типа
Код AS3:

function update(frame:uint):void;

Т.е. при передаче ему нового кадра он устанавливает точку воспроизведения в соответствующую позицию, если таковая не соответствует настоящему положению.
В отношении передачи такого параметра все еще проще. По ENTER_FRAME-у (или таймеру) делаем инкремент некоей переменной, которую передаем в качестве аргумента методу update вашего персонажа. Инкремент будет зависеть от кртаности. Т.е. если необходимо замедлить скорость проигрывания анимации в 3 раза, то выглядеть будет примерно так:
Код AS3:

private function onAnimationFrameChange(e:Event):void{
  _currentFrame+=_frameIndex;// значение _frameIndex - и есть показатель кратности
  _person.update(_currentFrame);//тут можно циклом, если таких объектов много
 
}

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

HardCoder 29.01.2012 02:11

Спасибо, с этим проблем нет. Такая задача легко решается. Просто из ваших слов:
Цитата:

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

понял, что вы имеете в виду как-то, не перескакивая несколько кадров, воспроизвести с низнким фреймрейтом анимацию быстро:)


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

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