AS3: запуск методов в упорядоченной последовательности - PullRequest
4 голосов
/ 23 октября 2010

У меня есть класс с несколькими методами, которые я должен запускать в определенном порядке.Итак, я создал некую цепочку, в которой каждый вызывает следующее в своем последнем предложении (иногда с вызовами, иногда с отправкой событий):

internal function a(evt:SwapEvent):void {   //started from custom event
  ...
  b();
}

private function b():void {
  ...
  bTimer = new Timer(bTime*1000,1);
  bTimer.addEventListener(TimerEvent.TIMER, bEnd);
  bTimer.start();
}

private function bEnd(evt:TimerEvent):void {
  bTimer.removeEventListener(TimerEvent.TIMER, bEnd);
  bTimer = null;                    
  c();
}

private function c():void {
  ...
  dispatchEvent(new CustomEvents(CustomEvents.NEXT_FRAME,1));
}
....
private function g():void {
  // tell the second class the sequence finished
}

Проблема в некоторой точке и до того, как прибыл последний методМне нужно снова запустить подпоследовательность, скажем, от функции c () до e ().И это вызывает проблемы в виде увеличения задержки между функциями (у меня есть 2 таймера)

Я думаю, что решение выглядит примерно так:

a();
b();
...
if (some condition) {
  c();
  ...
  e();
}
...
f();
g();

Но, насколько я знаюFlash Player не выполняет синхронное выполнение.т. е. он не ждет, пока метод a () завершит выполнение b ()

Есть идеи / предложения по чистой и пуленепробиваемой реализации?Это приложение будет работать в бесконечном цикле 24x7

Заранее спасибо,

Ответы [ 3 ]

4 голосов
/ 23 октября 2010

После прочтения вашего кода, да, вы правы.b () выполняется при достижении этой строки кода.

У меня может возникнуть желание создать очередь методов для выполнения.Выполните один, проверьте, есть ли у вас время для выполнения другого, прежде чем фрейм нуждается в обновлении, и повторите.Вы всегда можете вставить новые команды в очередь в любое время, поэтому b () может вставить endB () следующим в очереди.

Оба секвенсора на http://www.dpdk.nl/opensource/running-tasks-in-order-with-a-task-based-sequence-manager и http://as3.casalib.org/docs/org_casalib_time_Sequence.html должен делать то, что вам нужно.Первый может быть немного излишним, так как похоже, что вам нужно создавать отдельные классы для каждой из ваших задач, что может быть слишком много накладных расходов.С другой стороны, условные задачи выглядят именно так, как вам нужно.Последнее проще в том, что вы можете указать методы для выполнения.Тем не менее, кажется, что не существует встроенного способа для задания задач, но это может быть так же просто, как создать задачу, которая условно добавляет задачи.

Это может помочь узнать немного больше, как работают условия.

Другие вопросы:

Хвостовые вызовы не очень эффективны в AS.Думайте об этом как о добавлении большего в стек каждый раз, когда вы вызываете метод.Как только метод возвращается (даже если вы явно не используете return), метод удаляется из стека, и ранее вызванный метод будет продолжать выполняться.Таким образом, чем больше хвостовых вызовов, тем больше стек и тем больше нужно очистить.

Как только вы начинаете выполнять код, проигрыватель зависает, пока код полностью не запустится и выполнение не вернется к проигрывателю.У вас есть около 15 секунд на выполнение, прежде чем игрок убьет ваш сценарий, поэтому вы должны учитывать это при бесконечном выполнении кода.Решение состоит в том, чтобы выполнить некоторый код, а затем дождаться следующего кадра, чтобы выполнить больше.

Вам не нужно заново создавать таймеры, вы можете создать их один раз как переменные экземпляра и просто вызвать start.Таймеры вернут выполнение проигрывателю (если больше не будет выполнено ни одного вызова метода).

Несколько упрощенная версия, но я уверен, что вы поняли.

ДОБАВЛЕНИЕ: Я думаю, что выследует обратиться к шаблону команд (http://en.wikipedia.org/wiki/Command_pattern).. Вы можете хранить массив команд, которые должны быть выполнены (синхронно или асинхронно), а когда одна из них возвращает или отправляет завершенное событие, вы выполняете следующую. Я думаю, вы можете создатьпростая реализация шаблона команд, позволяющая делать то, что вам нужно, без лишних затрат на секвенсоры, о которых я упоминал ранее, но всегда полезно получить представление о том, как это сделали другие.

3 голосов
/ 23 октября 2010

Существует ряд библиотек, которые обеспечивают последовательное выполнение в AS3.Обычно они предназначены для выполнения анимации, поэтому они обычно имеют тенденцию к этому.

Например, Twease и Tweener позволят вам выполнять последовательные действия, а также общие анимационные действия.

Еще один особенно хорошийБиблиотека секвенирования включена в состав asapframework ..., который имеет класс с именем ActionQueue, к которому можно добавлять TimedAction элементов.Отличительной особенностью TimedAction & ActionQueue является возможность добавлять метод и аргументы отмены, если вам нужно запустить последовательность задом наперед.

Использование секвенсоров намного проще, чем установка массы таймеров.вручную.

1 голос
/ 23 октября 2010

Я не очень понимаю ваш вопрос. ActionScript в целом является синхронным (за исключением некоторых функций AIR, которые могут выполняться асинхронно), но таймер является асинхронным в том смысле, что ваш код не будет приостанавливать работу и ждать завершения таймера, прежде чем продолжить основной поток.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...