поток событий в сценарии действий 3 - PullRequest
2 голосов
/ 25 марта 2010

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

Вот мой код; что я пропустил?

public class Main extends MovieClip //main document class
    {
        var compSource:Game;
        var compMenu:Menu;

        public function Main() 
        {
            compSource = new Game;
            compMenu = new Menu();
            var mc:MovieClip = new MovieClip();
            addChild(mc);
            mc.addChild(compSource); // the source of the event - event dispatch when clicked btn
            mc.addChild(compMenu);  //in init of that Movie clip it add listener to the compSource events
        }

    }


public class Game extends MovieClip 
    {
        public function Game() 
        {
            btn.addEventListener(MouseEvent.CLICK, onFinishGame);
        }

        private function onFinishGame(e:MouseEvent):void 
        {

            var score:Number = Math.random() * 100 + 1;
            dispatchEvent(new ScoreChanged(score));
        }


    }

public class Menu extends MovieClip
    {
        //TextField score
        public function Menu() 
        {
            addEventListener(Event.ADDED_TO_STAGE, init);
        }   

        private function init(e:Event):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
//on init add listener to event ScoreChanged
            addEventListener(ScoreChanged.SCORE_GAIN, updateScore);
        }

        public function updateScore(e:ScoreChanged):void 
        {
//it never gets here!
            tScore.text = String(e._score);
        }   

    }



public class ScoreChanged extends Event
    {
        public static const SCORE_GAIN:String = "SCORE_GAIN";
        public var _score:Number;

        public function ScoreChanged( score:Number ) 
        {
            trace("new score");
            super( SCORE_GAIN, true);
            _score = score;
        }
}

Я не хочу писать на Main

compSource.addEventListener(ScoreChanged.SCORE_GAIN, compMenu.updateScore);

потому что я не хочу, чтобы compSource знал о compMenu; CompMenu несет ответственность за то, чтобы знать, какие события нужно слушать.

Ответы [ 2 ]

0 голосов
/ 28 марта 2010

Сандро прав, потому что события всплывают, а не вбок, ваш Menu никогда не увидит событие.

Возможное решение: поскольку Main уже «знает» о compSource и compMenu, вы можете безопасно передать событие через ваш основной класс:

class Main{
    public function Main() 
    {
        compSource = new Game();
        compSource.addEventListener(ScoreChanged.SCORE_GAIN, scoreGainHandler);
        compMenu = new Menu();
        //... rest of constructor
    }

    public function scoreGainHandler(event:ScoreChanged):void
    {
        compMenu.updateScore(event);
    }
    //... rest of class

Таким образом, ваши Game и Menu остаются независимыми.

На самом деле, если вы строите его таким образом, Menu вообще не нужно слушать событие изменения счета, вы можете просто изменить функцию обновления, чтобы получить переменную счета:

class Menu{

    public function updateScore(score:int):void 
    {
        tScore.text = String(score);
    }
    //... etc
0 голосов
/ 25 марта 2010

Игра и Меню находятся в разных цепочках в цепочке событий. События всплывают вверх, и так как Game и Menu являются братьями и сестрами, они не будут иметь доступа к событиям друг друга.

Одним из решений будет отправка ссылки на игру в меню с главного экрана. Затем добавьте прослушиватель событий из меню в этой точке.

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