自定义事件在AS3中不起作用

时间:2015-05-04 04:08:48

标签: actionscript-3 events custom-events

我有一个名为SelectEvent的事件。每当我点击买家时,都应该启动选择事件。但这不是正在发生的事情。

我的基地代码:

package 
{

    import flash.display.MovieClip;
    import flash.utils.Timer;
    import flash.events.TimerEvent;
    import flash.events.MouseEvent;

    public class FashionFrenzy extends MovieClip
    {

        public var Buyer_mc:Buyer;
        public var Buyers:Array;
        private var BuyerNumber:Number;
        public var xpositions:Array;
        public var ypositions:Array;
        public var SelectedBuyer:Number;

        public function FashionFrenzy()
        {

            GameTimeController();

            xpositions=new Array();
            xpositions.push(523,563,603);

            ypositions=new Array();
            ypositions.push(377,377,377);

            Buyers = new Array  ;
            BuyerNumber=0;


            Time_mc.gameTimer.addEventListener(TimerEvent.TIMER,GenerateBuyers);
            addEventListener(SelectEvent.BUYERSELECT,showselectbuyer);


        }


        public function GameTimeController()
        {
            Time_mc.StartGame();

        }
        public function showselectbuyer(event:SelectEvent):void
        {
            trace("Bamba");         
        }
        public function GenerateBuyers(event:TimerEvent):void
        {
            if(BuyerNumber<6)
            {
                if (Math.random() < 0.01)
                {
                    var position:Number = Math.floor(Math.random()*3);
                    var newBuyer_mc = new Buyer(xpositions[position],ypositions[position],BuyerNumber);
                    ypositions[position]-=40;
                    Buyers.push(newBuyer_mc);
                    addChild(newBuyer_mc);

                    BuyerNumber++;

                }
            }

                for each (var buyer_mc:Buyer in Buyers)
                {
                    if(buyer_mc.walking==true)
                    {

                        buyer_mc.Enter();


                    }


                }


        }








    }

}

我的买家代码:

package 
{

    import flash.display.MovieClip;
    import flash.utils.Timer;
    import flash.events.TimerEvent;
    import flash.events.MouseEvent;

    public class Buyer extends MovieClip
    {
        public var buyerTimer:Timer;
        public var walking:Boolean;
        public var stopposition:Number;
        public var buyerCode:Number;



        public function Buyer(startx:Number, stopy:Number, code:Number)
        {
            x=startx;
            stopposition=stopy;
            walking=true;
            buyerCode=code;

            BuyerProperties();

        }
        public function Enter():void
        {

            if(y>stopposition)
            {

                walking=false;
                StartFunction();

            }
            else
            {
                y= y+3;
            }
        }
        public function BuyerProperties():void
        {
            buyerTimer = new Timer( 25 );
            trace(" I am generated");

        }
        public function StartFunction():void
        {

            buyerTimer.start();
            addEventListener(MouseEvent.CLICK,Select);

            trace("My timer starts now within Buyer.as");
        }
        public function Select(event:MouseEvent):void
        {
            trace(buyerCode);
            dispatchEvent( new SelectEvent(SelectEvent.BUYERSELECT));
        }




    }

}

现在,当我点击买家时,会激活MouseEvent.CLICK,然后在buyer.as中,在屏幕上跟踪买家代码。但是事件没有被调度,或者它被调度,但eventlistener没有执行代码。我没有收到任何运行时错误。功能&#34; showselectbuyer&#34;从来没有推出。

我该如何解决?

2 个答案:

答案 0 :(得分:1)

接受的答案不正确。提供的解决方案有效但出于错误的原因。它创建了一个对应该监听自定义事件的对象的直接依赖,然后使该对象成为调度程序。总之,这使得完全不需要使用事件/自定义事件的想法,因为在这种情况下,简单的回调也可以正常工作。而是使用useCapture标志将使整个系统按预期工作:

addEventListener(SelectEvent.BUYERSELECT,showselectbuyer, true);

接受的解决方案也是处理非DisplayObject事件传播的相反方式。调度程序应该是侦听器(没有依赖项),而侦听器不应该是调度程序(必需依赖项)。

答案 1 :(得分:-1)

自定义事件的问题在于它们不会冒出显示列表,因此如果要注册您的事件,您需要将其分派给具有附加该事件的侦听器的类实例。在您的情况下,它是parent的一个实例。显然,买家不知道他们正在运行的时尚狂热实例,因此他们将事件发送给自己,并想知道为什么没有人听。要解决此问题,请将侦听器附加到买方,或者在买方类中将事件分派给$ sudo port install aspell,这显然是您要接收事件的实例。