Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Синхронность действий (http://www.flasher.ru/forum/showthread.php?t=85973)

acd 04.10.2006 21:58

Синхронность действий
 
Задумал сделать мини-игру на Flash, почитал пару книг, статей. Понял, что асинхронность некоторых действий происходит на автоматике, например метод “play()”, и организовать синхронность в таких методах (когда это необходимо) в виде замков (как например в C) нельзя, потому что замков как таковых просто нет.

А теперь собственно ситуация:

Имеется xml-документ, в нем храниться лог боя, а именно действия: номер действия, имя атакующего, защищающегося и нанесенный урон:
Код:

<BATTLE>

<ACTION act=”1” atk=”n1” dfn=”n2” dmg=”15”/>
<ACTION act=”2” atk=”n1” dfn=”n2” dmg=”10”/>

<ACTION act=”10” atk=”n2” dfn=”n1” dmg=”20”/>
</BATTLE>

Загружаю я xml-документ, добираюсь до тегов <ACTION> и начинается самое интересное: я отдаю команду мувиклипу на проигрывание “n1.play()” соответственно, так как метод асинхронный, то передается управление в тот блок кода, который собственно вызвал “n1.play()”, и соответственно я уже добираюсь до второго действия, начинается проигрываться “n1.play()” (во второй раз), но первое действие еще не закончилось, а цикл уже пошел выдавать второе, а потом третье и т.д.

Вопрос собственно такой, как мне дождаться полного проигрывания первого действия, и только потом перейти ко второму, а потом к третьему и т.д.?

Nirth 04.10.2006 22:15

Почитайте статью Евгения Потапенко о механизме конвеера, в его случае это класс на ActionScript 2.0

john 05.10.2006 03:35

ага... нужно на AS3 переписать.

MerlinTwi 05.10.2006 11:43

Как вариант, отказаться от play вообще, и по EnterFrame самостоятельно перемещать все объекты (если на нужный кадр, то gotoAndStop).

etc 05.10.2006 13:08

Цитата:

Сообщение от john
ага... нужно на AS3 переписать.

Кстати, мне эта мысль уже приходила в голову.
Тебя подождать или самим переписать? :)

acd 05.10.2006 13:53

Цитата:

Сообщение от Nirth
Почитайте статью Евгения Потапенко о механизме конвеера, в его случае это класс на ActionScript 2.0

спасибо, почитал - интересно..

acd 05.10.2006 13:55

Цитата:

Сообщение от MerlinTwi
Как вариант, отказаться от play вообще, и по EnterFrame самостоятельно перемещать все объекты (если на нужный кадр, то gotoAndStop).

Можно поподробнее?

Допустим есть у меня мувиклип бойца. С 1 по 10 кадр - анимация удара.
Главное не забывать, что мне нужно как-то получить знак от мувиклипа, что он прошел с 1 по 10 и можно выполнять след. действие.

MerlinTwi 05.10.2006 16:15

Цитата:

Сообщение от acd
мне нужно как-то получить знак от мувиклипа, что он прошел с 1 по 10 и можно выполнять след. действие.

Я вижу два варианта:

1. Заранее известно сколько кадров в анимации. Инициализируем счетчик на это количество кадров (n1.counter=10) и функции onEnterFrame уменьшаем его, как дошел до нуля анимация закончилась.

2. В последний кадр мувиклипа с анимацией прописать одну строчку кода, которая оповещает, что анимация закончилась, например, высылать событие:
Код:

dispatchEvent(new Event("animation_done",true));
. . .
//На руте или мувике в котором вся анимация крутится слушаем это событие
addEventListener("animation_done", onAnimationDone);
. . .
private function onAnimationDone(e:Event):void {
  trace(e.target); // ссылка на мувик, который закончил анимацию
}


john 05.10.2006 17:52

Цитата:

Сообщение от __etc
Кстати, мне эта мысль уже приходила в голову.
Тебя подождать или самим переписать? :)

да не, сам перепишу. скоро

etc 05.10.2006 18:22

Цитата:

Сообщение от john
да не, сам перепишу. скоро

Ждём :victory:


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

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