自定义事件监听器不工作

Custom Event Listener not working

我是 as3 的新手,我最近在教程中看到了在 as3 中创建自定义事件,我想将其合并到我的游戏中。当我完成教程时,该项目似乎一切都很好。但它似乎不适用于新项目。

这是我的代码:

package 
{

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

 public class FashionFrenzy extends MovieClip
 {
  
  public var Buyer_mc:Buyer;
  public var Buyers:Array;
  public var gameTimer:Timer;

  public function FashionFrenzy()
  {
   
   GameTimeController();
   GenerateBuyers();
   addEventListener(ReachMallDoorEvent.CHECK, OnReachMallDoor);

  }

  
  public function GameTimeController()
  {
   gameTimer = new Timer( 25 );
   gameTimer.start();
  }
  public function GenerateBuyers()
  {
   Buyers = new Array  ;
   Buyer_mc = new Buyer(533.2,0)  ;
   addChild(Buyer_mc);
   gameTimer.addEventListener( TimerEvent.TIMER, BuyerEnter );
   
   
   if(Buyer_mc.y==377.25)
   {
    dispatchEvent( new ReachMallDoorEvent( ReachMallDoorEvent.CHECK ) );
   }
     
   
   
  }
  
  public function BuyerEnter(event:TimerEvent)
  {

   Buyer_mc.Enter();
  }
  
  public function OnReachMallDoor(event:ReachMallDoorEvent)
  {
   
   trace("my timer starts now");
  }
  
  

 }

}

在这里,OnReachMallDoor 似乎从来没有 运行 因为有问题。我看不到输出 "My timer starts now"。但是代码中没有错误,输出也没有显示任何 运行time 错误。我哪里出错了?当我的 y 坐标处于理想位置并且事件被调度时,我希望 OnReachMallDoor 函数为 运行。

命令顺序错误

GenerateBuyers();
addEventListener(Rea...

这两行中的第一行可能会导致事件被调度。但只有在那之后你才会开始倾听它。那简直太晚了。您必须在调度事件之前开始收听。

Event被派发的概率很低

Buyer_mc.y==377.25

检查浮点值是否相等通常不是一个好主意。由于舍入错误等原因,它很容易略微偏离。例如,如果此 .y 属性 由鼠标控制,则您必须将鼠标精确定位在该位置,这是不太可能的.

您只在开始时发送事件。

GenerateBuyers();

该函数只被调用一次。 .y 位置被评估。 这种情况只会发生一次,绝不会再发生。 但是 .y 位置可能会发生变化,应该再次评估条件,这不会发生

结构没有帮助。

对象监听自己的事件没有多大意义。只需调用该函数即可完成。

事件用于对象之间的通信。


应该是这样的:

习俗 Event 的要点是通知某事。 您希望在这种情况下得到通知

Buyer_mc.y==377.25

是真的。 如果您按照现在的方式评估该条件,那么接收有关其结果的通知就没有意义了。你已经有了。

相反,Buyer_mc 应该调度 Event。应在 Buyer class.

中检查条件

代码是什么样的

一些片段指出了上面的意思,代码未经测试:

class 买家

override public function set y(value:Number):void
{
    if (value == 377.25)
        dispatchEvent(new ReachMallDoorEvent(ReachMallDoorEvent.CHECK)); // I'm at the position, I send out the notification
    super.y = value;
}

class 时尚狂潮

buyer = new Buyer(533.2, 0); // variables should start with small letter
buyer.addEventListener(ReachMallDoorEvent.CHECK, OnReachMallDoor);

如果您现在将 .y 位置设置为该值,该对象将调度 Event。它会自己解决这个问题。

让对象自行解决问题并仅接收有关它的通知是使用自定义事件的主要原因。