Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash Приложения: AIR, Zinc и тд. (http://www.flasher.ru/forum/forumdisplay.php?f=94)
-   -   Freeze AIR-приложения на девайсе при сворачивании (http://www.flasher.ru/forum/showthread.php?t=210379)

mikhailk 07.03.2015 13:03

Freeze AIR-приложения на девайсе при сворачивании
 
Нужен совет.

Есть проект на нативном флеше, в котором логика работы базируется на:
1. событиях, связанных с анимацией (ENTER_FRAME, COMPLETE)
2. событиях, связанных с проигрыванием звуковых файлов (COMPLETE)
3. отложенных вызовах функций (setTimeout или завершение выполнения других функций)
4. вызовах функций по таймеру

Так сложилось исторически, плюс по геймплею действительно необходимо, чтобы в случаях 1-2 это было именно так (например, анимация в некоторых случаях для слабых машин удлиняется по времени, чтобы обеспечить "гладкость", пусть и в замедленном варианте).

После портирования в мобильный вариант на Starling'е естественным образом столкнулся с ситуацией, что при сворачивании приложения на девайсе анимация останавливается:

Код AS3:

NativeApplication.nativeApplication.addEventListener( Event.DEACTIVATE, function ( e : * ) : void
{
    if ( Starling.current ) Starling.current.stop( true );
} );

но все остальное живет своей жизнью.

Сейчас в размышлении. Либо дорабатывать каждый из сервисов звука и времени отдельно (в т.ч., делать свой setTimeout с возможностью заморозки), либо организовать единый FreezeService и регистрировать в нем звуки, таймеры, отложенные вызовы, а затем все фризить и восстанавливать централизованно.

Интересует, кто и как решает задачу заморозки.

ЗЫ. Посмотрел аналогичные приложения для Android'а, мнгие пошли по пути упрощения (например, отказались от фоновой музыки), но это не мой путь точно.

Zebestov 07.03.2015 13:22

Устанавливать видный всем флаг паузы как минимум. Чтобы все, кто работает вопреки остановки старлинга, ничего не делали, пока приложение не активируется. Это так, выход на скору руку.

mikhailk 07.03.2015 16:33

Цитата:

Чтобы все, кто работает вопреки остановки старлинга, ничего не делали, пока приложение не активируется
В смысле, "больше" ничего не делали.
Если играет фоновая музыка, это ее не остановит. Опять же, например, полет ракеты через весь экран со звуком - сворачиваем приложение, анимация стопится, звук доигрывает, разворачиваем приложение - ракета летит в совершенной тишине.

Так что я сейчас фактически размышляю, на каком уровне размещать функционал. В частности для звука:

1. Вместо стандартного Sound сделать свой FreeseSound (унаследованный от Sound), который при создании автоматически подписывается на FreeseDispatcher.instance и слушает от него события FREEZE/UNFREEZE, по которым соответственно останавливает/запускает звук. Придется предусмотреть деструктор, в котором отписываться от диспетчера.

или

2. Сделать единый FreezeSoundRegister, в котором регистрировать при запуске те звуки, которые требуют заморозки (например, звуки кликов по кнопкам фризить не надо) и уже в нем останавливать/запускать все зарегистрированные звуки оптом. Снимать регистрацию для звуков ручками в коде либо автоматически по событию COMPLETE, если звук одноразовый.

Zebestov 07.03.2015 16:47

Короткие звуки можно просто остановить. Фоновую музыку можно заглушить — пускай играет сколько сможет на нулевой громкости.

У меня все звуки в игре вообще живут в одном классе типо SoundManager, который предоставляет методы наподобие playClick(), muteGameplayMusic(), playJump() и далее в таком духе. Таким образом работа со звуком приложения не представляет особой сложности.

mikhailk 07.03.2015 19:50

Это понятно. Просто для того, чтобы тормознуть/зафэйдить звуки, надо их знать. Т.е., либо учитывать в каком-нибудь регистраторе (или внутри самого SoundManager'а) и потом пройтись по ним, либо сделать у них внутри механизм, который будет отрабатывать автоматически.

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

Впрочем, я походу определился. Иногда сформулировать проблему полезно и для себя самого.

caseyryan 07.03.2015 19:58

Есть же класс SoundMixer, который может управлять глобальными настройками звука в эйр и флеш плеере.
Я всегда использую его в таких случаях

mikhailk 07.03.2015 20:54

Цитата:

Есть же класс SoundMixer, который может управлять глобальными настройками звука в эйр и флеш плеере.
Есть, конечно.
И как он поможет разрулить вот эту ситуацию?

Цитата:

Сейчас у меня, как я написал выше, стартует ракета (время пролета через экран около секунды, включая колебания на старте). И при старте полета запускается звук соответствующей длительности, который синхронизирован с визуализацией. Просто прервать этот звук при остановке визуализации недостаточно.
Недостаточно - потому что после того, как приложение будет восстановлено и ракета продолжит полет, звук ее полета надо восстановить с того момента, где он был остановлен. И таких (аналогичных) звуков - много. В приложении вообще много разной анимации с соответствующим звуковым сопровождением, работающей одновременно. Все пляшет и светится.

Нет, понятно, что часть звуков можно просто прибить, часть надо остановить и запомнить, где остановили. Чтобы потом дружно запуститься всем зоопарком. Я просто решал, делать для этого единый процессор/контроллер, который будет за все отвечать, или спустить функционал фриза на уровень звуков, что одно событие FREEZE, выпущенное соответствующим диспетчером, автоматически останавливало все звуки, причем каждый сам запоминал, где остановился, и сам знал, откуда ему запускаться, когда прилетит событие UNFREEZE.

caseyryan 07.03.2015 21:47

Для запуска с того же места, на ум приходит пока только такое решение: сделать класс наследник Sound, и в нем считать сколько миллисекунд он уже отыграл. А в момент возобновления звучания - передавать в метод play() нужное число
Ну или даже не наследник, а просто обертку для Sound.

У меня, кстати, тоже такая же проблема. Но руки пока до написания решения не дошли, есть дела по-важнее. Тоже будет интересно решение

mikhailk 07.03.2015 23:35

Цитата:

на ум приходит пока только такое решение: сделать класс наследник Sound
Да, это один из вариантов, которые я предложил выше.


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

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