EventDispatcher между ас и фла?

Я делаю файтинг во 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) может обнаружить это событие нажатия, выгрузить игру и вернуться к выбору персонажа. экран?

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

-Кристофер


person Christopher Richa    schedule 25.03.2010    source источник


Ответы (2)


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

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

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

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

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

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

person Jonathan Czitkovics    schedule 29.03.2010
comment
Спасибо за вашу помощь, это как бы направило меня в правильном направлении. - person Christopher Richa; 31.03.2010

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

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

Доступ к SharedObject можно получить из любого места в приложении/игре, если на него правильно ссылаются. Поэтому я просто создал SharedObject под названием "winLossData" со значением "НЕТ ПОБЕДИТЕЛЕЙ" на экране выбора персонажа. Этот файл 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. Как только кука меняет значения, Menu.fla автоматически выгружает внешний swf (в нашем случае Arena.swf) и отображает результаты, соответственно полученному SharedObject. Остальные действия происходят внутри файла Menu.fla, поэтому нет необходимости в дополнительном кодировании.

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

person Christopher Richa    schedule 01.04.2010