Пауза в игре

То что касается флеша, но не касается ВКонтакте API. Например проблемы при создании прыгающего мячика.
Ответить
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

Пауза в игре

Сообщение Agiliter »

Добрый день!
Естественно, при создании игры задумался о паузе. Самый простой вариант, как я думал, делать все апдейты привязанными к frameRate. Т.е. там, где требуется пользование промежутками времени, использовать Event.ENTER_FRAME. Соответственно при паузе ставить stage.frameRate = 0; и всё - все анимации и процессы, завязанные на частоте кадров останавливаются, а затем возобновить можно, просто вернув stage.frameRate = 30. Однако не тут-то было. Когда ставлю

Код: Выделить всё

stage.frameRate = 0;trace(stage.frameRate);
получаю трейсом значение 0.01 и соответственно процессы замедляются, но не останавливаются. Как я узнал свойство frameRate может принимать значения не от 0, а от 0.01 до 1000. Безобразие.

Теперь, как вижу два выхода: или создать какой-то глобальный таймер (каким образом?), который можно было бы останавливать и снова запускать, или же создавать в каждом из множества объектов метод pause() и start(), что как-то геморно. Есть у кого подобный опыт, как сделать проще?
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

Re: Пауза в игре

Сообщение XELAD »

Лично у меня в визуализируемых классах прописаны public static var & function UPDATE(). Если нет паузы, то в одном общем enterFrame пишу class1.UPDATE(); class2.UPDATE(); Классы же у себя в static var хранят ссылки на экземпляры, обновляют их в цикле (в public static function UPDATE).
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

Re: Пауза в игре

Сообщение Agiliter »

Собственно, пришел к такому выводу. Завязать всё на один таймер или enterfarame. Вот с реализацией как обычно.
Как я думаю, некий глобальный контроллер передает свой таймер всем заинтересованным объектам, которые по тикам делают update. Когда же нужно поставить на паузу, то мы останавливаем таймер, и у всех объектов автоматически останавливается update. Логично? Только вот передавать всем нужным объектам таймер.. Очень большая связность, что не есть хорошо.

Другой момент. Фактически при паузе необходимо останавливать все звуки, все визуальные эффекты, ставить на паузу все локальные таймеры и т.д. Как это реализовать вышеизложенным подходом непонятно. Может быть создать какие-то отдельные классы для контроля на над всеми звуками, над всеми эффектами и т.д., а затем подписать их на события START, PAUSE, RESUME в каком-нить глобальном контейнере? После диспетчерезации этого события, все подписанные на него сервисы принимают необходимые меры для обеспечения функционала. Также тогда придется подписывать на на эти события все остальные объекты. Помогите разобраться.
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

Re: Пауза в игре

Сообщение XELAD »

Не знаю, что вы имеете в виду под "эффектами". Расширить MovieClip, контролируя текущий воспроизводимый кадр, используя вместо (gotoAnd)Play -(gotoAnd)Stop(кадр), достаточно легко. При Update() обновлять цифру текущего кадра. Нет Update - нет воспроизведения.
Для звуков и музыки придётся писать отдельный менеджер, или позаимствовать в интернете ;)

Передавать всем, кого вы хотите контролировать, ссылку на таймер, это, как я понял, добавить слушатель TICK каждому заинтересованному объекту. Не лучшая идея. Прописать в глобальный контроллер все контролируемые классы - намного проще. В каждом классе реализовать глобальную функцию static public update, которая пройдёт по экземплярам класса и вызовет private update.

А говоря о локальных таймерах, мой совет: не используйте их, и не нужно будет отключать.
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

Re: Пауза в игре

Сообщение Agiliter »

XELAD писал(а):Передавать всем, кого вы хотите контролировать, ссылку на таймер, это, как я понял, добавить слушатель TICK каждому заинтересованному объекту. Не лучшая идея.
Почему?
XELAD писал(а):Не знаю, что вы имеете в виду под "эффектами".
Анимации любого рода.
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

Re: Пауза в игре

Сообщение XELAD »

Передавать всем, кого вы хотите контролировать, ссылку на таймер, это
256 байт оперативной памяти на каждый слушатель, если не ошибаюсь. Плюс к этому вам нужно будет их удалять при удалении объекта, а это значит, иметь ссылку на функцию в главном контроллере, а это ещё больше кода и привязки в каждом классе.
Ответить