自定义事件在 AS3 中不起作用
Custom events not working in AS3
我有一个名为 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();
}
}
}
}
}
我的买家代码:
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 中,屏幕上会显示买家代码。但是事件没有被调度或者它被调度但是事件监听器没有执行代码。我没有收到任何运行时错误。函数 "showselectbuyer" 甚至从未启动过。
我该如何解决?
自定义事件的问题在于它们不会在显示列表中冒泡,因此如果要注册您的事件,您需要将其分派到具有该事件侦听器的 class 实例随附的。在您的例子中,它是 FashionFrenzy
的一个实例。显然,买家并不知道他们 运行 身处的时尚狂潮,因此他们将活动安排给自己,并想知道为什么没有其他人在听。为了解决这个问题,要么将侦听器附加到买家,要么在买家 class 中将事件发送到 parent
,这显然是您想要接收事件的实例。
接受的答案不正确。提供的解决方案有效,但出于错误的原因。它创建了对应该监听自定义事件的对象的直接依赖,然后使该对象成为调度程序。总之,这使得使用 event/custom 事件的整个想法充其量是不必要的,因为在这种情况下,一个简单的回调也可以正常工作。相反,使用 useCapture 标志将使整个系统按预期工作:
addEventListener(SelectEvent.BUYERSELECT,showselectbuyer, true);
公认的解决方案也是处理非 DisplayObject 事件传播的逆向方法。调度程序应该是侦听器(无依赖项),而不是侦听器应该是调度程序(需要依赖项)。
我有一个名为 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();
}
}
}
}
}
我的买家代码:
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 中,屏幕上会显示买家代码。但是事件没有被调度或者它被调度但是事件监听器没有执行代码。我没有收到任何运行时错误。函数 "showselectbuyer" 甚至从未启动过。
我该如何解决?
自定义事件的问题在于它们不会在显示列表中冒泡,因此如果要注册您的事件,您需要将其分派到具有该事件侦听器的 class 实例随附的。在您的例子中,它是 FashionFrenzy
的一个实例。显然,买家并不知道他们 运行 身处的时尚狂潮,因此他们将活动安排给自己,并想知道为什么没有其他人在听。为了解决这个问题,要么将侦听器附加到买家,要么在买家 class 中将事件发送到 parent
,这显然是您想要接收事件的实例。
接受的答案不正确。提供的解决方案有效,但出于错误的原因。它创建了对应该监听自定义事件的对象的直接依赖,然后使该对象成为调度程序。总之,这使得使用 event/custom 事件的整个想法充其量是不必要的,因为在这种情况下,一个简单的回调也可以正常工作。相反,使用 useCapture 标志将使整个系统按预期工作:
addEventListener(SelectEvent.BUYERSELECT,showselectbuyer, true);
公认的解决方案也是处理非 DisplayObject 事件传播的逆向方法。调度程序应该是侦听器(无依赖项),而不是侦听器应该是调度程序(需要依赖项)。