|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Freeze AIR-приложения на девайсе при сворачивании
Нужен совет.
Есть проект на нативном флеше, в котором логика работы базируется на: 1. событиях, связанных с анимацией (ENTER_FRAME, COMPLETE) 2. событиях, связанных с проигрыванием звуковых файлов (COMPLETE) 3. отложенных вызовах функций (setTimeout или завершение выполнения других функций) 4. вызовах функций по таймеру Так сложилось исторически, плюс по геймплею действительно необходимо, чтобы в случаях 1-2 это было именно так (например, анимация в некоторых случаях для слабых машин удлиняется по времени, чтобы обеспечить "гладкость", пусть и в замедленном варианте). После портирования в мобильный вариант на Starling'е естественным образом столкнулся с ситуацией, что при сворачивании приложения на девайсе анимация останавливается: NativeApplication.nativeApplication.addEventListener( Event.DEACTIVATE, function ( e : * ) : void { if ( Starling.current ) Starling.current.stop( true ); } ); Сейчас в размышлении. Либо дорабатывать каждый из сервисов звука и времени отдельно (в т.ч., делать свой setTimeout с возможностью заморозки), либо организовать единый FreezeService и регистрировать в нем звуки, таймеры, отложенные вызовы, а затем все фризить и восстанавливать централизованно. Интересует, кто и как решает задачу заморозки. ЗЫ. Посмотрел аналогичные приложения для Android'а, мнгие пошли по пути упрощения (например, отказались от фоновой музыки), но это не мой путь точно. |
|
|||||
Lorem ipsum
|
Устанавливать видный всем флаг паузы как минимум. Чтобы все, кто работает вопреки остановки старлинга, ничего не делали, пока приложение не активируется. Это так, выход на скору руку.
__________________
Поймай яблоко 2! |
|
|||||
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Цитата:
Если играет фоновая музыка, это ее не остановит. Опять же, например, полет ракеты через весь экран со звуком - сворачиваем приложение, анимация стопится, звук доигрывает, разворачиваем приложение - ракета летит в совершенной тишине. Так что я сейчас фактически размышляю, на каком уровне размещать функционал. В частности для звука: 1. Вместо стандартного Sound сделать свой FreeseSound (унаследованный от Sound), который при создании автоматически подписывается на FreeseDispatcher.instance и слушает от него события FREEZE/UNFREEZE, по которым соответственно останавливает/запускает звук. Придется предусмотреть деструктор, в котором отписываться от диспетчера. или 2. Сделать единый FreezeSoundRegister, в котором регистрировать при запуске те звуки, которые требуют заморозки (например, звуки кликов по кнопкам фризить не надо) и уже в нем останавливать/запускать все зарегистрированные звуки оптом. Снимать регистрацию для звуков ручками в коде либо автоматически по событию COMPLETE, если звук одноразовый. |
|
|||||
Lorem ipsum
|
Короткие звуки можно просто остановить. Фоновую музыку можно заглушить — пускай играет сколько сможет на нулевой громкости.
У меня все звуки в игре вообще живут в одном классе типо SoundManager, который предоставляет методы наподобие playClick(), muteGameplayMusic(), playJump() и далее в таком духе. Таким образом работа со звуком приложения не представляет особой сложности.
__________________
Поймай яблоко 2! |
|
|||||
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Это понятно. Просто для того, чтобы тормознуть/зафэйдить звуки, надо их знать. Т.е., либо учитывать в каком-нибудь регистраторе (или внутри самого SoundManager'а) и потом пройтись по ним, либо сделать у них внутри механизм, который будет отрабатывать автоматически.
Кроме того, есть другие случаи, которые требуют не только остановки звука, но и запуска с той позиции, на которой звук остановился. Сейчас у меня, как я написал выше, стартует ракета (время пролета через экран около секунды, включая колебания на старте). И при старте полета запускается звук соответствующей длительности, который синхронизирован с визуализацией. Просто прервать этот звук при остановке визуализации недостаточно. Впрочем, я походу определился. Иногда сформулировать проблему полезно и для себя самого. |
|
|||||
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Цитата:
И как он поможет разрулить вот эту ситуацию? Цитата:
Нет, понятно, что часть звуков можно просто прибить, часть надо остановить и запомнить, где остановили. Чтобы потом дружно запуститься всем зоопарком. Я просто решал, делать для этого единый процессор/контроллер, который будет за все отвечать, или спустить функционал фриза на уровень звуков, что одно событие FREEZE, выпущенное соответствующим диспетчером, автоматически останавливало все звуки, причем каждый сам запоминал, где остановился, и сам знал, откуда ему запускаться, когда прилетит событие UNFREEZE. |
|
|||||
Для запуска с того же места, на ум приходит пока только такое решение: сделать класс наследник Sound, и в нем считать сколько миллисекунд он уже отыграл. А в момент возобновления звучания - передавать в метод play() нужное число
Ну или даже не наследник, а просто обертку для Sound. У меня, кстати, тоже такая же проблема. Но руки пока до написания решения не дошли, есть дела по-важнее. Тоже будет интересно решение |
|
|||||
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Цитата:
|
Часовой пояс GMT +4, время: 17:52. |
|
« Предыдущая тема | Следующая тема » |
|
|