Форум Академгородка, Новосибирск > flash проблема с синхронизацией fps в movie clip'ах
Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: flash проблема с синхронизацией fps в movie clip'ах
Форум Академгородка, Новосибирск > Компьютеры и сети > Программирование > WEB-программирование
Adgar
Есть две флешки. (1)-ая флешка основная, в нее вставляются все остальные. У нее стоит fps=12 и изменять его нельзя.
(2)-ая флешка с линейной анимацией имеет fps=30. Далее все содержимое второй флешки преобразуется в movie clip, который переносится во флешку (1). В результате mc в первой флешки играется в 3 раза медленее чем оригинале.

Во флеше не силен и не люблю его, поэтому вопрос к флешерам:
Есть ли какая-нибудь тулза, которой можно подать .fla на вход, а она пересчитает линейку под нужный fps (т.е. изменит fps, но оставит скорость проигрывания такой же как была)?

или же какой-нибудь flash-component для as3, который программно синхронизует fps во всех mc с основным fps.
Знаю, что есть метод через setInterval, но мне кажется очень плохо a) писать код в кадрах mc; cool.gif код надо писать в каждом mc
dfl
Скорее всего единственный адекватный вариант в данном случае - написать небольшую обертку над мувиком, которая будет управлять его эффективным fps. Далее все пояснения в терминах AS3, хотя все то же самое легко делается и в AS2.

Итак, оборачиваем нужный мувик в класс (тоже мувик или спрайт, по вкусу), который при добавлении к нему в дисплейный список объекта (Event.ADDED) рекурсивно проходится по всем его дисплейным спискам и останавливает воспроизведение. А при инициализации нашей обертки регистрируем обработчик Event.ENTER_FRAME, который программно управляет обновлением текущего кадра у всех дочерних объектов. Т.е. если прошло больше времени с предыдущего кадра (можно использовать getTimer()), чем время для одного кадра дочерней анимации, то меняем текущий кадр дочерней анимации соответствующим образом (вариантов много, в частности можно использовать MovieClip.gotoAndStop()).

Конечно, с этим подходом есть некоторые проблемы. Как и с другими.
1) Если анимация в дочернем ролике расчитана на больший fps, то будут пропускаться кадры. К сожалению, этого никак не избежать.
2) Если дочерний мувик каким-либо образом осуществляет управление своей анимацией, то возможны различные неприятные "спецэффекты".
Виконт
Использовать класс Timer с интервалом 33 (fps - 30). В обработчике события таймера поставить две комманды: clip.nextFrame() и event.updateAfterEvent(). Всё, никаких пропусков кадров, никаких "спецэффектов", clip играет со скоростью 30 fps независимо от Stage.fps.

Кстати, для загружаемых клипов это можно делать автоматически: загружаем клип, считываем loaderInfo.frameRate, дальше устанавливаем таймер, как описано вверху, и запускаем клип с нужным fps.
dfl
Цитата(Виконт @ 15.12.2008, 12:10) *
Использовать класс Timer с интервалом 33 (fps - 30). В обработчике события таймера поставить две комманды: clip.nextFrame() и event.updateAfterEvent(). Всё, никаких пропусков кадров, никаких "спецэффектов", clip играет со скоростью 30 fps независимо от Stage.fps.

Отличный способ, спасибо.

Однако он также не лишен недостатков. Во-первых, никто не гарантирует, что таймер будет срабатывать хотя бы примерно с заданным интервалом (попробуйте интервал 50 и fps основного ролика 1). А следовательно, кадры все же могут пропускаться. Во-вторых, событие Event.ENTER_FRAME не станет происходить чаще, а значит, если дочерний мувик управляет своей анимацией из обработчика этого события, то анимация "поломается".
Виконт
Ну я ещё могу придумть штук 7 крайних случаев, чтобы это не работало, и что? Это какие-то надуманные измышления. Зачем основной клип делать самый медленный?

Вот вам совершенно бесполезный способ сделать это идеально: грузите внешние клипы в отдельные HTML лайеры, кладите поверх основной флэшки, вешайте на них transparent mode и управляйте ими из основного клипа через ExternalInterface. biggrin.gif
dfl
Цитата(Виконт @ 03.01.2009, 2:26) *
Вот вам совершенно бесполезный способ сделать это идеально: грузите внешние клипы в отдельные HTML лайеры, кладите поверх основной флэшки, вешайте на них transparent mode и управляйте ими из основного клипа через ExternalInterface. biggrin.gif


Тогда уж лучше через LocalConnection biggrin.gif
Виконт
Цитата(dfl @ 07.01.2009, 15:38) *
Цитата(Виконт @ 03.01.2009, 2:26) *
Вот вам совершенно бесполезный способ сделать это идеально: грузите внешние клипы в отдельные HTML лайеры, кладите поверх основной флэшки, вешайте на них transparent mode и управляйте ими из основного клипа через ExternalInterface. biggrin.gif


Тогда уж лучше через LocalConnection biggrin.gif


Сомнительное удовольствие, LC - асинхронный интерфейс и не имеет выходов на JS функции biggrin.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2024 IPS, Inc.