我是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似乎永远不会运行,因为有些错误。我看不出输出说"我的计时器现在开始"。但是代码中没有错误,输出也没有显示任何运行时错误。我哪里出错了?我希望OnReachMallDoor函数在我的y坐标处于所需位置并且调度事件时运行。
答案 0 :(得分:1)
命令的顺序错误。
GenerateBuyers();
addEventListener(Rea...
这两个中的第一行是可能导致调度Event的行。但只有在那之后你才会开始倾听它。那太晚了。你必须先开始听 调度事件。
调度事件的概率非常低。
Buyer_mc.y==377.25
检查浮点值是否相等通常不是一个好主意。由于舍入错误等原因,它可能很容易略微偏离。例如,如果此.y
属性由鼠标控制,则您必须将鼠标定位在该位置,这是非常不可能的。 / p>
您只能在开始时发送活动。
GenerateBuyers();
该功能仅被调用一次。评估.y
位置。
这只发生过一次而且再也不会发生。
但是.y
位置可能会发生变化,应该再次评估条件,这不会发生
结构无用。
对象监听自己的事件没有多大意义。只需调用该功能即可完成。
事件用于对象之间的通信。
这应该如何:
自定义Event
的要点是要通知某事。
您希望在此条件时收到通知
Buyer_mc.y==377.25
是真的。 如果您正在以现在的方式评估该条件,那么接收有关其结果的通知是没有意义的。你已经拥有它了。
相反,Buyer_mc
应该发送Event
。应在Buyer
类中检查条件。
代码是什么
一些片段指出了上述含义,代码未经测试:
类买家
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;
}
类FashionFrenzy
buyer = new Buyer(533.2, 0); // variables should start with small letter
buyer.addEventListener(ReachMallDoorEvent.CHECK, OnReachMallDoor);
如果您现在将.y
位置设置为该值,则对象将调度Event
。它会自己解决这个问题。
让对象自行解决问题,只是收到有关它的通知是使用自定义事件的主要原因。