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

Вернуться   Форум Flasher.ru > Flash > Flash Приложения: AIR, Zinc и тд.

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
По умолчанию 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'а, мнгие пошли по пути упрощения (например, отказались от фоновой музыки), но это не мой путь точно.

Старый 07.03.2015, 13:22
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 2  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Устанавливать видный всем флаг паузы как минимум. Чтобы все, кто работает вопреки остановки старлинга, ничего не делали, пока приложение не активируется. Это так, выход на скору руку.
__________________
Поймай яблоко 2!

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Цитата:
Чтобы все, кто работает вопреки остановки старлинга, ничего не делали, пока приложение не активируется
В смысле, "больше" ничего не делали.
Если играет фоновая музыка, это ее не остановит. Опять же, например, полет ракеты через весь экран со звуком - сворачиваем приложение, анимация стопится, звук доигрывает, разворачиваем приложение - ракета летит в совершенной тишине.

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

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

или

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

Старый 07.03.2015, 16:47
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 4  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Короткие звуки можно просто остановить. Фоновую музыку можно заглушить — пускай играет сколько сможет на нулевой громкости.

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

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Это понятно. Просто для того, чтобы тормознуть/зафэйдить звуки, надо их знать. Т.е., либо учитывать в каком-нибудь регистраторе (или внутри самого SoundManager'а) и потом пройтись по ним, либо сделать у них внутри механизм, который будет отрабатывать автоматически.

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

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

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Есть же класс SoundMixer, который может управлять глобальными настройками звука в эйр и флеш плеере.
Я всегда использую его в таких случаях

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Цитата:
Есть же класс SoundMixer, который может управлять глобальными настройками звука в эйр и флеш плеере.
Есть, конечно.
И как он поможет разрулить вот эту ситуацию?

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

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

Старый 07.03.2015, 21:47
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 8  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Для запуска с того же места, на ум приходит пока только такое решение: сделать класс наследник Sound, и в нем считать сколько миллисекунд он уже отыграл. А в момент возобновления звучания - передавать в метод play() нужное число
Ну или даже не наследник, а просто обертку для Sound.

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

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Цитата:
на ум приходит пока только такое решение: сделать класс наследник Sound
Да, это один из вариантов, которые я предложил выше.

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

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

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


 


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


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