EventDispatcher между как и фла? - PullRequest
0 голосов
/ 25 марта 2010

Я делаю файтинг во Flash, и пока у меня все работает, мне чего-то не хватает: экран победы / поражения. Логично, я знаю, как это сделать:

if character.hp < 0
{
    character.dead = true;
    dispatchevent("death", event)
}

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

У меня есть два файла .fla, которые воспроизводятся здесь: файл Menu.fla и файл Arena.fla. Menu.fla содержит всю навигацию по игре, опции, экраны выбора персонажей и т. Д., И когда игроку пора вступить в бой, он загружает файл Arena.fla, который содержит только фоны (в зависимости от выбранного Этап) и на данный момент установлен на длину только одного кадра. Для Arena.fla реальное действие происходит в моих классах, но по логике вещей мне понадобятся только HP.as и Character.as.

В Character.as я объявил следующую переменную:

var isDead:Boolean = false;    //is character dead?

В HP.as, поверьте, у меня должно быть следующее:

if(currentHp<0)
{
    currentHp = 0;
    character.isDead = true;     //declared as var `character:Object;`
    EventDispatcher.dispatchEventListener("playerDead", playerDead);
}

И, наконец, в Arena.fla я хочу иметь возможность обнаружить вышеупомянутый список событий и просто перейти ко второму кадру, в котором будет отображаться сообщение в стиле «ИГРОК ОГРАНИЧЕН» или «ОДИН ИГРОК» «ПОТЕРЯЛ» с кнопкой, которая позволит мне вернуться к экрану выбора персонажа. Это первая часть, в которой я застрял: как я могу обнаружить отправленный обработчик событий в моем основном файле .fla?

Во-вторых, если игрок нажимает кнопку «ПРОДОЛЖИТЬ», которая отображается независимо от того, выиграл игрок или проиграл, как мой Menu.fla (который загружает Arena.swf) может обнаружить это событие, выгрузить игру, и вернуться к экрану выбора персонажа?

Заранее спасибо за помощь. Я понимаю, что это много текста, но это самый описательный из всех, что я могу. Если у вас есть какие-либо вопросы или вам нужны разъяснения по моему вопросу, не стесняйтесь говорить.

-Christopher

Ответы [ 2 ]

1 голос
/ 29 марта 2010

Я не уверен насчет кода, который вы должны прочитать HP, но знаете ли вы, что character.dead на самом деле становится правдой?

В HP.as всегда можно вызвать функцию Arena.swf, которая завершит игру и объявит победителя. Вы можете добавить второй кадр в Arena.swf, содержащий затемненный фон и текст ПОБЕДИТЕЛЯ или ПОБЕДИТЕЛЯ .

В общем, для пользовательского класса самый простой способ получить возможности диспетчеризации событий - это расширить EventDispatcher. Если это невозможно (то есть, если класс уже расширяет другой класс), вы можете вместо этого реализовать интерфейс IEventDispatcher, создать член EventDispatcher и написать простые перехватчики для маршрутизации вызовов в агрегированный EventDispatcher.

1010 * активировать * Отправляется, когда Flash Player или приложение AIR фокусируются на операционной системе и становятся активными.

дезактивировать Отправляется, когда Flash Player или приложение AIR теряют фокус операционной системы и становятся неактивными.

Диспетчер событий

0 голосов
/ 02 апреля 2010

Спасибо всем за помощь, но я понял это. Оказывается, мой метод был слишком сложным для того, что я хотел сделать, и для времени, которое я оставил. Я объясню, как я это сделал.

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

A SharedObject может быть доступен из любого места в приложении / игре, при условии, что к нему правильно обращаются. Поэтому я просто создал SharedObject с именем "winLossData", установленным на "NO WINNERS" на экране выбора персонажа. Этот файл cookie никогда не сохраняется и не записывается на диск, поэтому у пользователя нет никаких шансов найти его (вообще говоря).

Я решил использовать класс Movement.as, который содержит все мои элементы управления, и написал прослушиватель событий типа Event.ENTER_FRAME, который постоянно проверяет состояние здоровья моих персонажей. Если один из них ниже 100, мой SharedObject немедленно принимает значение «ИГРОК ОГРАНИЧЕННЫЙ» или «ИГРОК ДВУХ», в зависимости от того, кто выиграл (то есть, чьи очки здоровья не ниже 100). После этого, просто из соображений безопасности, я сбросил очки здоровья потерянного персонажа на 100. Вот код:

    function whoWon(event:Event):void
    {
        if(playerSpriteBar.getPower() <= 0)
        {
            winner.data.winner = "Player Two";
            playerSpriteBar.update(100);
        }
        if(playerAIBar.getPower() <= 0)
        {
            winner.data.winner = "Player One";
            playerAIBar.update(100);
        }
    }

В моем Menu.fla у меня есть еще один прослушиватель событий типа Event.ENTER_FRAME, который ждет, когда cookie изменит значение. Как только файл cookie изменяет значения, Menu.fla автоматически выгружает внешний SWF (в нашем случае Arena.swf) и отображает результаты в соответствии с полученным SharedObject. Остальные действия выполняются внутри файла Menu.fla, поэтому нет необходимости в дополнительном кодировании.

Еще раз спасибо всем за помощь.

...