Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 自定义事件在AS3中不起作用_Actionscript 3_Events_Custom Events - Fatal编程技术网

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

Actionscript 3 自定义事件在AS3中不起作用,actionscript-3,events,custom-events,Actionscript 3,Events,Custom Events,我有一个叫做SelectEvent的事件。每当我点击买家时,都会启动select事件。但事实并非如此 我的基地代码: package { import flash.display.MovieClip; import flash.utils.Timer; import flash.events.TimerEvent; import flash.events.MouseEvent; public class FashionFrenzy extends M

我有一个叫做SelectEvent的事件。每当我点击买家时,都会启动select事件。但事实并非如此

我的基地代码:

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();


                    }


                }


        }








    }

}
现在,当我单击buyer时,MouseEvent.CLICK被激活,然后在buyer.as中,buyercode在屏幕上被跟踪。但是事件没有被调度,或者它被调度,但是eventlistener没有执行代码。我没有收到任何运行时错误。“showselectbuyer”功能从未启动过


我应该如何解决它?

自定义事件的问题是它们不会在显示列表中冒泡,因此,如果要注册事件,您需要将其分派到附加了该事件侦听器的类实例。在你的例子中,这是
时尚狂热的一个例子。显然,买家不知道他们正在经历的时尚狂热事件,所以他们将事件发送给自己,并想知道为什么没有人听。要解决此问题,请将侦听器附加到buyer,或者在buyer类中将事件分派到父级,这显然是您希望接收事件的实例。

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

addEventListener(SelectEvent.BUYERSELECT,showselectbuyer, true);

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

在查看代码时,注意到
bullers=newarray应该是
买家=新数组()。好的,我正在修复。非常感谢。但解决这一问题并不会对我面临的问题产生影响。您是否正在为
SelectEvent
类冒泡事件?仅供参考,我建议使用AS3信号而不是事件。冒泡是什么意思@斯莱拉斯卡尔非常感谢你。添加“父对象”效果很好。@将侦听器添加到买方对象是更好的选择。在当前设置中,只有买家的家长可以监听事件。这就破坏了首先使用事件的意义,即在两个对象之间创建松散耦合。如果任何对象都可以向买家添加侦听器,则情况就是这样。但是你现在这样做,你的结构非常严格。只有父级才会分派事件。正确的解决方案是简单地将useCapture设置为true。使用“parent”即使它确实提供了PO问题的解决方案,但它在一开始就完全违背了使用event的目的,并且被错误地标记为正确答案。我理解你想说的@null,我仍在试图弄清楚BotMaster的方法是如何正确的,虽然它帮助了我,我有了一个更好的主意。“这个参数改变了听的阶段。它不会产生事件泡泡。”在我的回答中,它说它会产生事件泡泡吗?冒泡与否如果您不使用Capture设置为true,您将无法捕获事件的冒泡阶段。感谢您的澄清。这似乎仍然有点离题,令人困惑。如果不知道如何使事件冒泡,知道如何在冒泡阶段捕获是没有帮助的,因为这是事件对象本身的属性。不,setCapture不需要监听冒泡事件。如果您只需将useCapture设置为true就可以运行PO代码,那么将捕获该事件,我认为这将是对PO问题的一个比接受的更好的答案。这就是我发布答案的目的。接受的答案错误地创建了一个直接依赖项,它完全违背了使用自定义事件的目的,但仍然使用自定义事件。我相信有话要说。你能把它编辑成你的答案吗?目前的情况是,将true作为第三个参数传递给addEventListener可能会被误解为在冒泡阶段捕获事件“无论是否自定义”。但是对于一个不冒泡的事件,没有冒泡阶段,这个自定义事件也不会冒泡。参数值true会导致使用捕获阶段,从而使此工作正常。很好,你的答案解决了这个问题,但是用冒泡来解释这个问题感觉有点不正确,可能会让OP感到困惑。当你要求我修改@BotMaster时,我尝试了修改代码,它再次起作用。我想我理解了你的意思,但我仍然不知道bubbling或useCapture到底是做什么的。如果我能更清楚地知道这些是什么,那会有很大帮助。
addEventListener(SelectEvent.BUYERSELECT,showselectbuyer, true);