![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jun 2007
Адрес: Москва
Сообщений: 86
|
Есть очень ёмкая игра. Внезапно требования к готовой игре изменились и нужно в любой момент поставить на паузу всё происходящее в геймплее. А в игру помимо этого включены 2 немаленькие мини-игры.
То есть нужно остановить всю динамику, все твины, таймауты, интервалы, задержки. Запаузить все твины не проблема, так как пользуюсь Tweener-ом. Но проблема с постановкой на паузу setTimeout и setInterval. Думал, что проще всего заменить эти функции классом, делающим тоже самое, но использующем Timer. Но тут я обнаруживаю, что и Timer нельзя поставить на паузу, а потом возобновить! Как быть? Нет, есть, конечно решение чтобы Timer считал каждую микросекунду на каждый setTimeout и setInterval, а потом после снятия с паузы пересчитывал количество оставшихся микросекунд до конца. Но это динамичная игра, и, боюсь, с её количествами интервалов и таймаутов проц этого не потянет. Или потянет если сделать один таймер, срабатывающий каждую микросекунду, а назначаемые по задержкам функции, будут плясать от этого одного таймера? Кратко о реальной задаче: остановить выполнение всего когда в миг, отобразить окошко с предложением выйти или остаться в игре, и по результату обратно возобновить выполение кода. Или же всё таки имеет смысл обойтись без игровой паузы, из-за сложности/невозможности ActionScript рационально запаузить таймеры? |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Проц потянет 99 к 1. Как бы ни сделал. Во флэше тормозит рендер %)
На многих порталах в их API есть требование для подобной паузы, думаю стоит делать. По-моему во флэш играх удобнее делать как в "больших" играх, т.е. нафик таймауты, есть большой update(dt:Number), который говорит кому надо, что прошло время dt. У меня лично использовался массив, в котором сидят те, кому надо, каждый ENTER_FRAME вычисляется dt и у них у всех дёргается их update(dt). Есть методы для добавления и доставания из этого массива. Доставание какбэ должно быть долгим и потому лучше использовать Dictionary, а не массив (бонус - слабые ссылки), что я и советую, но тормозов и с массивом нет, т.к. подписывающихся на update сравнительно мало (штук 300). В рамках такой штуки легко можно сделать свои setTimeout и пр. с паузой. |
|
|||||
|
Нене, это ужасно - ставить таймер на 1 мс. У вас такая погрешность будет, что мама не горюй. Помнится Волгоградец поднимал тему паузы, экстендил свой класс от Timer`а, а вот найти не могу
К нему, наверное, можно обратиться.Код на паузу не поставишь, к сожалению.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Регистрация: Jun 2007
Адрес: Москва
Сообщений: 86
|
Понятно. Пока что нарыл маленькое спасение в виде getTimer(), благодаря которому можно рассчитать разницу задержки. От этого можно плясать, написав свой таймер, который поддерживает паузу. А раз есть таймер с паузой, то можно написать класс менеджер всех таймеров, копирующий работу setInterval и setTimeout, но с возможностью паузы. Это позволит сделать дело практически не меняя код. Но я боюсь как бы не вышло, что я ставлю на паузу, а некоторая часть кода может выполниться не так как-нить. Всё таки 11000 чистых строк кода, а с пробелами и каментами за 15 в голове тяжело держать. Делать по вашему принципу уже поздняк. Вот так вот сначала отсутствие ТЗ, а потом требования, после "это были самые последние требования".
Вообще у разработчиков 3 скрипта хорошая трава. Спасибо хоть за getTimer(). Добавлено через 3 минуты Кстати, вот этот код с паузой: package { import flash.utils.Timer; import flash.utils.getTimer; public class PerfectTimer { public var _delay:Number; public var _lastTime:Number; public var _repeat:Number; public var _thisTime:Number = 0; public var timer:Timer; public function PerfectTimer(delay:Number, repeat:uint=0):void { _delay = delay; _repeat = repeat; timer = new Timer(delay,repeat); } public function start():void { _lastTime = getTimer(); timer.start(); } public function pause():void { timer.stop(); _thisTime = getTimer() - _lastTime; } public function repeat(new_delay:Number):void { _lastTime = getTimer(); timer.delay = new_delay; } public function resume():void { if (_thisTime > timer.delay) { _thisTime = timer.delay; } timer.delay -= _thisTime; _lastTime = getTimer(); timer.start(); _thisTime = 0; } } } |
|
|||||
|
Не тестил, но бросив взгляд на код у меня ощущение, что если после возобновления паузы надо запустить скрипт через 100 мс, а задержка 1 секунда, то его начнет колотить по 100 мс, т.е. нету возвращения после пауза-резюме стартового значения delay.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Регистрация: Jun 2007
Адрес: Москва
Сообщений: 86
|
Верное у вас ощущение. Сам не заметил, бросился писать менеджер таймеров. Не сложно поправить это дело, главное что начало есть от чего отталкиваться. И еще вопрос несколько упрощается тем, что для аналогов setInterval и setTimeout свойство repeat таймера будет только 0 и 1 соответственно.
Добавлено через 2 часа 19 минут ВЫВОД: хрень это всё с getTimer() или просто с классом Timer. Нихрена он не считает верно. А может и верно, но не вовремя запускается. Простейший опыт показал, что достаточно начать быстро двигать мышкой, чтобы немножко загрузить процессор, которую даже никакой лисенер не прослушивает во флеше, и интервалы начинают плыть. То есть если управлять основым кодом с помощью подобной паузы никогда не получить идеального соответствия, интервалы будут плыть относительно загрузки компа. Видел еще в инете опыт с вычислением задержки с помощью Date(). По идее раз Date() берет системное время, то должно быть идеально, т.к. системное время не плывет, в зависимости от загрузки компа. Добавлено через 2 часа 47 минут Блин идея! Использовать Tweener. У него по умолчанию пауза и возобновление есть. Скармливать ему пустой объект, и без изменения каких-либо его параметров назначать нужный мне онкамплит. |
|
|||||
|
Вот допиливал Timer. Даже в играх использую - норм. работает.
http://www.flasher.ru/forum/showpost...8&postcount=20 |
|
|||||
|
Регистрация: Jun 2007
Адрес: Москва
Сообщений: 86
|
Всем спасибо. Идея использовать Tweener сработала. Чем и хорошо, что одновременно ставятся на паузу и таймауты и анимация, и никто из них никогда не сможет сдвинуться по времени друг от друга.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 18:04. |
|
|
« Предыдущая тема | Следующая тема » |
|
|