【问题标题】:Custom Event Listener not working自定义事件侦听器不起作用
【发布时间】:2015-04-29 17:07:07
【问题描述】:

我是 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 坐标处于所需位置并且事件被调度时运行。

【问题讨论】:

  • 只是 AS3 编码的一个提示。让实例名以小写字母开头,类名以大写字母开头。这是标准做法,有助于提高可读性(和代码高亮)
  • 您确定您的if(Buyer_mc.y == 377.25) 条件得到满足吗?在 if 语句之前和之后放置一个跟踪语句以查看。除非涉及其他一些代码,否则我不确定它怎么会是true - 你开始你的gameTimer 但永远不要用它做任何事情或听计时器滴答声。似乎您希望 if 条件位于计时器滴答处理程序中
  • 非常感谢我发现错误只是 if(Buyer_mc.y == 377.25) 不经常见面。 :)

标签: actionscript-3 events event-handling custom-events


【解决方案1】:

命令顺序错误。

GenerateBuyers();
addEventListener(Rea...

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

Event 被派发的概率很低。

Buyer_mc.y==377.25

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

您只在开始时调度事件。

GenerateBuyers();

该函数只被调用一次。评估.y 位置。 这只会发生一次,永远不会再发生。 但是.y 的位置可能会发生变化,需要重新评估条件,这不会发生

结构没有帮助。

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

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


应该是这样的:

自定义Event 的意义在于通知某事。 您希望在出现这种情况时收到通知

Buyer_mc.y==377.25

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

相反,Buyer_mc 应该调度 Event。应在Buyer 类中检查条件。

代码是什么样子的

一些sn-ps指出上面的意思,代码未经测试:

类采购员

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;
}

类时尚狂潮

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

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

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

【讨论】:

  • 非常感谢您提供详细和解释性的答案。它帮助很大。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
相关资源
最近更新 更多