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

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

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

Регистрация: Jun 2010
Сообщений: 19
По умолчанию Как сделать надежную паузу в игре?

Есть fla файл
Код AS3:
init();
doSomething();
doSomethingElse();
end();
Нужно чтобы программа после выполнения:

Код AS3:
init();
doSomething();
//останавливалась и ждала секунду или несколько, а затем выполняла:
doSomethingElse();
//и наконец
end();



Если использовать эту конструкцию:
Код AS3:
function sleepingFun (event:TimerEvent):void
{
doSomethingElse();
}
 
 
var tact:Timer = new Timer(1000,1);
tact.addEventListener(TimerEvent.TIMER_COMPLETE, sleepingFun);
tact.start();
То end() выполняется раньше чем doSomethingElse();

Добавлять в sleepingFun end не имеет смысла, так как пауза может быть и вложенной и последовательно несколько пауз может быть.

Я уже с неделю над задачкой бьюсь. Помогите, плиз или подскажите, может я чего не понимаю?

Старый 24.10.2010, 04:49
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Ну наверно создать Очередь? Например массив методов. И в обработчике событий таймера вызывать их по очереди (по счетчику).
__________________
Reality.getBounds(this);

Старый 24.10.2010, 04:51
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 3  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Цитата:
может я чего не понимаю?
Верно. Такое сделать нельзя. Используйте событийную модель, для подобных вещей. Выполнение кода остановить нельзя.

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

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Не использовать таймеры. Использовать только одно подписывание на ENTER_FRAME, которое у всего, чего надо вызывает когда надо update(dt), где dt - время между фреймами.
http://www.kongregate.com/forums/4/topics/1773
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 24.10.2010, 13:14
OlegEF вне форума Посмотреть профиль Отправить личное сообщение для OlegEF Найти все сообщения от OlegEF
  № 5  
Ответить с цитированием
OlegEF

Регистрация: Jun 2010
Сообщений: 19
Цитата:
Сообщение от i.o. Посмотреть сообщение
Используйте событийную модель
Пример кода можете привести?

Добавлено через 2 минуты
Цитата:
Сообщение от -De- Посмотреть сообщение
Не использовать таймеры. Использовать только одно подписывание на ENTER_FRAME, которое у всего, чего надо вызывает когда надо update(dt), где dt - время между фреймами.
http://www.kongregate.com/forums/4/topics/1773
Посмотрел, по английски не понимаю.
А что касается приведенного в статье кода, то он не полный.
Можете помочь понять о чем там речь идет?

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

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
Можете помочь понять о чем там речь идет?
Ну так -De- уже описал о чем там речь.

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

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Я больше за организацию основного цикла работы в играх писал и паузы типа юзер вызвал меню %)
Код AS3:
init();
doSomething();
//останавливалась и ждала секунду или несколько, а затем выполняла:
doSomethingElse();
//и наконец
end();
Вот так не то чтобы совсем нельзя, но реализация этого поимеет столько гадких побочных эффектов, что оно того однозначно не стоит (ну например оно перерисовываться не будет при выполнении).
Надо понять, как вообще покадровая система флэша работает. Где-то было описание, но я сейчас не найду, потому своими словам (с неточностями, но основную идею передает):
идёт обработка всех событий (заход в кадр и обработка кода, типа того, что выше - тоже там), затем отрисовка, затем, если осталось время, можно поспать и потом цикл повторяется. Ну т.е. у вас там было написано

Код AS3:
init();
doSomething();
//код с таймером
end();
- так так оно и выполнилось, в одном кадре.
В статье речь о том, что можно сделать "класс" типа такого.
Код AS3:
package  
{
	import flash.events.Event;
	import flash.utils.getTimer;
 
	public class Update
	{
		private static var oldTime:Number = Number.NaN;
		private static var updateables:Array = new Array;
		private static var pauseLevel:int = 0;
 
		public static function update(ev:Event):void {
			var nowTime:Number = getTimer();
			if (isNaN(oldTime)) oldTime = nowTime;
			var dt:Number = nowTime - oldTime;
			oldTime = nowTime;
 
			if (pauseLevel == 0) {
				for each(var updateable:Object in updateables) {
					updateable.update(dt);
				}
			}
		}
		public static function pause():void {
			++pauseLevel;
		}
		public static function unpause():void {
			--pauseLevel;
		}
		public static function add(updateable:Object):void {
			//лучше написать интерфейс IUpdateable, в котором есть только одна функция public function update(dt:Number):void; и заменить все Object на IUpdateable
			updateables.push(updateable);
		}
		public static function remove(updateable:Object):void {
			for (var i:int = 0; i < updateables.length; ++i) {
 
			}
		}
	}
}
Затем подписать его и только его на ENTER_FRAME - addEventListener(Event.ENTER_FRAME, Update.update); , всё, что как-то зависит от времени, паузится итп. имеет функцию update(dt:Number):void, в которой (и только в ней) собственно происходят какие-то действия, зависящие от времени. Пауза/пуск там написаны.
Писать в кадрах при таком подходе оч. тяжко, что только плюс =)
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

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

Регистрация: Jun 2010
Сообщений: 19
Спасибо.
А пример использования такого класса можете привести?
Только не очень сложный.

Добавлено через 6 часов 22 минуты
Я только начинаю программировать на Action Script.
Без понятия как использовать этот класс.

Я сейчас делаю так:

Это fla файл:

Код AS3:
var mstate:int = 0; // начальное состояние  программы
var tact:Timer = null; 
 
function init() {	trace("INIT");}
 
function doSomething(){	trace("DO SOMETHING");}
 
function doSomethingElse()  { trace("DO SOMETHING ELSE"); }
 
function end() { trace("END"); }
 
 
function nowDoIt (event:TimerEvent):void 
{
	doSomethingElse();
	mstate = 3;
}
 
function pauseDoSomethingElse()
{
	if(tact == null)
	{
		tact = new Timer(5000,1); 
		tact.addEventListener(TimerEvent.TIMER_COMPLETE, nowDoIt);
		tact.start();
	}
}
 
 
function main(event:Event)
{
	if(mstate == 0)
	{
		init();
		mstate = 1;
	}
	else if(mstate == 1)
	{
		doSomething();
		mstate = 2;
	} 
	else if (mstate == 2)
	{
		pauseDoSomethingElse();
	}
	else if (mstate == 3)
	{
		end();
		mstate = 4;
	}
 
}
Но возникают проблемы с отрисовкой карт. Поэтому и возник вопрос о другой реализации пауз.

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

Теги
delay , pause , задержка времени

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

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


 


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


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