Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 28.01.2012, 22:49
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 1  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
По умолчанию Как реализовать движение обьекта с настройкой его скорости

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

Старый 28.01.2012, 22:59
TanaTiX вне форума Посмотреть профиль Отправить личное сообщение для TanaTiX Найти все сообщения от TanaTiX
  № 2  
Ответить с цитированием
TanaTiX
 
Аватар для TanaTiX

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
Управление анимацией персонажа - отдельный интерфейс. При значительном увеличении скорости (в кратное или близкое ему значение: х2, х3, х4...) - перепрыгивать через кадры соответственно кратности.
А движение самого объекта - хоть enter_frame-ом, хоть твинером, не принципиально.
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

Старый 28.01.2012, 23:15
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 3  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Спасибо. Перекурив - понял, что без изменения фреймрейта нельзя прокрутить анимацию, не схавав некоторые кадры...
__________________
Я мало чего умею, но зато хорошо умею учиться...

Старый 29.01.2012, 00:02
TanaTiX вне форума Посмотреть профиль Отправить личное сообщение для TanaTiX Найти все сообщения от TanaTiX
  № 4  
Ответить с цитированием
TanaTiX
 
Аватар для TanaTiX

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
менять фрэймрэйт - плохая идея, а вот менять частоту обновления картинки нужных объектов (персонажей) - самое то будет
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

Старый 29.01.2012, 00:20
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 5  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Цитата:
Сообщение от TanaTiX Посмотреть сообщение
менять фрэймрэйт - плохая идея, а вот менять частоту обновления картинки нужных объектов (персонажей) - самое то будет
А как эту частоту изменить? Ведь пользователь не увидит изменения, пока не произойдет перерисовка. Или, вы имеете в виду: запустив таймер в два раза быстрее чем фреймрейт и в каждой итерации изменять картинку (например nextFrame) и вызывать updateAfterEvent(). Но тогда, как бы там ни было - частота кадров все равно ускорится в двое, потому что кадр будет выполнятся не по enterFrame, а по updateAfterEvent().
__________________
Я мало чего умею, но зато хорошо умею учиться...

Старый 29.01.2012, 01:49
TanaTiX вне форума Посмотреть профиль Отправить личное сообщение для TanaTiX Найти все сообщения от TanaTiX
  № 6  
Ответить с цитированием
TanaTiX
 
Аватар для TanaTiX

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
Картинка по определению не должна перерисовываться чаще, чем фрэймрэйт самого приложения, который нет смысла выставлять выше 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 перестанет быть нужным. Вот как-то так.
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

Старый 29.01.2012, 02:11
HardCoder вне форума Посмотреть профиль Отправить личное сообщение для HardCoder Найти все сообщения от HardCoder
  № 7  
Ответить с цитированием
HardCoder
 
Аватар для HardCoder

блогер
Регистрация: Apr 2011
Сообщений: 583
Записей в блоге: 2
Спасибо, с этим проблем нет. Такая задача легко решается. Просто из ваших слов:
Цитата:
Сообщение от TanaTiX Посмотреть сообщение
менять фрэймрэйт - плохая идея, а вот менять частоту обновления картинки нужных объектов (персонажей) - самое то будет
понял, что вы имеете в виду как-то, не перескакивая несколько кадров, воспроизвести с низнким фреймрейтом анимацию быстро
__________________
Я мало чего умею, но зато хорошо умею учиться...

Создать новую тему Ответ Часовой пояс GMT +4, время: 02:52.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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