我正在研究类似于“愤怒的小鸟”“推出”选项等的东西,但我遇到了一个相当大的问题。
推出本身只是一个切换按钮,显示列表中添加了几个其他按钮,当您触摸切换按钮时它们会移动。这些按钮中的每一个都是扩展 Sprite 的类,并包含用于触摸事件、开始、结束和结束的单独方法。当这些按钮被初始化(未实例化)时,将添加触摸开始侦听器。像这样的东西:
public function Initialize():void
{
this.addEventListener(TouchEvent.TOUCH_BEGIN, OnTouchBegin, false, int.MAX_VALUE);
}
private function OnTouchBegin(e:TouchEvent):void
{
this.removeEventListener(TouchEvent.TOUCH_BEGIN, OnTouchBegin);
this.addEventListener(TouchEvent.TOUCH_END, OnTouchRelease, false, int.MAX_VALUE);
this.addEventListener(TouchEvent.TOUCH_OUT, OnTouchOut, false, int.MAX_VALUE);
}
private function OnTouchRelease(e:TouchEvent):void
{
this.addEventListener(TouchEvent.TOUCH_BEGIN, OnTouchBegin, false, int.MAX_VALUE);
this.removeEventListener(TouchEvent.TOUCH_END, OnTouchRelease);
this.removeEventListener(TouchEvent.TOUCH_OUT, OnTouchOut);
}
private function OnTouchOut(e:TouchEvent):void
{
this.addEventListener(TouchEvent.TOUCH_BEGIN, OnTouchBegin, false, int.MAX_VALUE);
this.removeEventListener(TouchEvent.TOUCH_END, OnTouchRelease);
this.removeEventListener(TouchEvent.TOUCH_OUT, OnTouchOut);
}
然后,当这些按钮从屏幕上隐藏时,会调用一个方法来删除当前在它们上活动的任何侦听器:
public function Deactivate():void
{
this.removeEventListener(TouchEvent.TOUCH_OUT, OnTouchOut);
this.removeEventListener(TouchEvent.TOUCH_END, OnTouchRelease);
this.removeEventListener(TouchEvent.TOUCH_BEGIN, OnTouchBegin);
}
这仅适用于标准按钮功能(向上/向下纹理和声音),除此之外,当我制作游戏时,在我的 rollout 类中,我有一个额外的方法,它将为应该发生的自定义逻辑添加另一个事件侦听器当按钮被触摸时(按钮本身在其他地方创建)。
public function AddRolloutButton(listener:Function):void
{
if (listener != null)
{
_buttons[index].addEventListener(TouchEvent.TOUCH_BEGIN, listener);
}
卷展栏本身的按钮会从显示列表中删除,直到它们被显示。当 rollout 关闭时,按钮被停用(从显示列表中删除,并且按钮类中的 3 个按钮侦听器被删除)。
在我第一次打开和关闭推出时,一切都运行良好。在那之后,事件调度系统就莫名其妙地死掉了。屏幕上的每个 InteractiveObject,无论位置或类型如何,都会变得不可用。我在推出切换按钮上追踪了听众是否仍然存在,并且确实存在。我还确认推出按钮本身是显示列表中唯一的东西。
我注意到的是,如果我在触摸开始侦听器的按钮的 deactivate 方法中注释掉侦听器删除,或者在 AddRolloutButton 方法中为侦听器方法传入 null,则一切正常。问题似乎源于在推出按钮上有多个相同类型的侦听器,然后删除其中一个或全部。
如果有人对正在发生的事情有任何想法,那将非常有帮助。我的印象是向 InteractiveObject 添加多个相同类型的侦听器是完全有效的。
更新:
我遇到的这个问题似乎只破坏了 TouchEvents。在打开和关闭推出后,我刚刚尝试在舞台上使用鼠标单击侦听器,这仍然有效。所以,只有触摸事件会被破坏,如果这有帮助的话。