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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

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

Регистрация: Jun 2007
Адрес: Москва
Сообщений: 86
По умолчанию Поставить игру на паузу в любой момент.

Есть очень ёмкая игра. Внезапно требования к готовой игре изменились и нужно в любой момент поставить на паузу всё происходящее в геймплее. А в игру помимо этого включены 2 немаленькие мини-игры.
То есть нужно остановить всю динамику, все твины, таймауты, интервалы, задержки.
Запаузить все твины не проблема, так как пользуюсь Tweener-ом.
Но проблема с постановкой на паузу setTimeout и setInterval.
Думал, что проще всего заменить эти функции классом, делающим тоже самое, но использующем Timer. Но тут я обнаруживаю, что и Timer нельзя поставить на паузу, а потом возобновить! Как быть?

Нет, есть, конечно решение чтобы Timer считал каждую микросекунду на каждый setTimeout и setInterval, а потом после снятия с паузы пересчитывал количество оставшихся микросекунд до конца. Но это динамичная игра, и, боюсь, с её количествами интервалов и таймаутов проц этого не потянет. Или потянет если сделать один таймер, срабатывающий каждую микросекунду, а назначаемые по задержкам функции, будут плясать от этого одного таймера?

Кратко о реальной задаче: остановить выполнение всего когда в миг, отобразить окошко с предложением выйти или остаться в игре, и по результату обратно возобновить выполение кода.

Или же всё таки имеет смысл обойтись без игровой паузы, из-за сложности/невозможности ActionScript рационально запаузить таймеры?

Старый 19.05.2010, 17:39
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 2  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Проц потянет 99 к 1. Как бы ни сделал. Во флэше тормозит рендер %)
На многих порталах в их API есть требование для подобной паузы, думаю стоит делать.
По-моему во флэш играх удобнее делать как в "больших" играх, т.е. нафик таймауты, есть большой update(dt:Number), который говорит кому надо, что прошло время dt. У меня лично использовался массив, в котором сидят те, кому надо, каждый ENTER_FRAME вычисляется dt и у них у всех дёргается их update(dt). Есть методы для добавления и доставания из этого массива. Доставание какбэ должно быть долгим и потому лучше использовать Dictionary, а не массив (бонус - слабые ссылки), что я и советую, но тормозов и с массивом нет, т.к. подписывающихся на update сравнительно мало (штук 300).
В рамках такой штуки легко можно сделать свои setTimeout и пр. с паузой.

Старый 19.05.2010, 18:56
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 3  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Нене, это ужасно - ставить таймер на 1 мс. У вас такая погрешность будет, что мама не горюй. Помнится Волгоградец поднимал тему паузы, экстендил свой класс от Timer`а, а вот найти не могу К нему, наверное, можно обратиться.

Код на паузу не поставишь, к сожалению.

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

Регистрация: Jun 2007
Адрес: Москва
Сообщений: 86
Понятно. Пока что нарыл маленькое спасение в виде getTimer(), благодаря которому можно рассчитать разницу задержки. От этого можно плясать, написав свой таймер, который поддерживает паузу. А раз есть таймер с паузой, то можно написать класс менеджер всех таймеров, копирующий работу setInterval и setTimeout, но с возможностью паузы. Это позволит сделать дело практически не меняя код. Но я боюсь как бы не вышло, что я ставлю на паузу, а некоторая часть кода может выполниться не так как-нить. Всё таки 11000 чистых строк кода, а с пробелами и каментами за 15 в голове тяжело держать. Делать по вашему принципу уже поздняк. Вот так вот сначала отсутствие ТЗ, а потом требования, после "это были самые последние требования".
Вообще у разработчиков 3 скрипта хорошая трава. Спасибо хоть за getTimer().

Добавлено через 3 минуты
Кстати, вот этот код с паузой:
Код AS3:
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;
		}
	}
}

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

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
Не тестил, но бросив взгляд на код у меня ощущение, что если после возобновления паузы надо запустить скрипт через 100 мс, а задержка 1 секунда, то его начнет колотить по 100 мс, т.е. нету возвращения после пауза-резюме стартового значения delay.

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

Регистрация: Jun 2007
Адрес: Москва
Сообщений: 86
Верное у вас ощущение. Сам не заметил, бросился писать менеджер таймеров. Не сложно поправить это дело, главное что начало есть от чего отталкиваться. И еще вопрос несколько упрощается тем, что для аналогов setInterval и setTimeout свойство repeat таймера будет только 0 и 1 соответственно.

Добавлено через 2 часа 19 минут
ВЫВОД: хрень это всё с getTimer() или просто с классом Timer. Нихрена он не считает верно. А может и верно, но не вовремя запускается. Простейший опыт показал, что достаточно начать быстро двигать мышкой, чтобы немножко загрузить процессор, которую даже никакой лисенер не прослушивает во флеше, и интервалы начинают плыть.
То есть если управлять основым кодом с помощью подобной паузы никогда не получить идеального соответствия, интервалы будут плыть относительно загрузки компа.
Видел еще в инете опыт с вычислением задержки с помощью Date(). По идее раз Date() берет системное время, то должно быть идеально, т.к. системное время не плывет, в зависимости от загрузки компа.

Добавлено через 2 часа 47 минут
Блин идея! Использовать Tweener. У него по умолчанию пауза и возобновление есть. Скармливать ему пустой объект, и без изменения каких-либо его параметров назначать нужный мне онкамплит.

Старый 20.05.2010, 12:01
Волгоградец вне форума Посмотреть профиль Отправить личное сообщение для Волгоградец Найти все сообщения от Волгоградец
  № 7  
Ответить с цитированием
Волгоградец
 
Аватар для Волгоградец

блогер
Регистрация: Sep 2007
Адрес: Гамбург
Сообщений: 1,648
Записей в блоге: 12
Вот допиливал Timer. Даже в играх использую - норм. работает.
http://www.flasher.ru/forum/showpost...8&postcount=20

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

Регистрация: Jun 2007
Адрес: Москва
Сообщений: 86
Всем спасибо. Идея использовать Tweener сработала. Чем и хорошо, что одновременно ставятся на паузу и таймауты и анимация, и никто из них никогда не сможет сдвинуться по времени друг от друга.

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

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

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


 


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


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