我正在开发小型 Flash 游戏。游戏包含 20 个关卡和主菜单。通过删除框架上的每个对象以及所有事件侦听器来实现级别之间的转换。然后代码从下一级添加对象......
捕获和删除事件侦听器由以下代码完成:
override public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void
{
super.addEventListener(type, listener, useCapture, priority, useWeakReference);
arrListeners.push({type:type, listener:listener});
}
private function clearEvents():void
{
for(var i:Number = 1; i<arrListeners.length; i++){
if(this.hasEventListener(arrListeners[i].type))
{
this.removeEventListener(arrListeners[i].type, arrListeners[i].listener);
}
}
arrListeners = []
}
此代码覆盖内部 addEventListeners 并使每个侦听器都添加到数组中。第二个函数检查 EventListeners 是否仍然存在(之前没有删除),然后从数组中删除每个 Listener。
此代码适用于分配给舞台的 EventListener。但是,当 EventListener 直接分配给 Object 时,它不会添加到数组中,因此以后不会自动删除。
我知道当你删除对象时,你也会删除分配给它的事件监听器。但是当我再次添加该对象时,侦听器会运行两次。您可以在关卡中自由移动,因此您可以来回走动。当你回去时,我会遇到问题。系统被过度使用并且工作速度变慢,因为正在运行的事件侦听器的数量增加了一倍。
那么,您能否修改此代码或给我一个建议,我如何才能捕获分配给 Object 的 EventListener 并最终删除它们。
代码:
package
{
Public Class Main extends MovieClip
{
Public function Main()
{
Intro();
}
Private function Intro():void
{
//Constructor contains a lot of addChild and a EventListeners. So I will upload what I think i important for this problem.
Play_btn.addEventListener(MouseEvent.CLICK, clicked);
function clicked (e:MouseEvent):void
{
clearEvents();
clearChild(); // function that removes all children on stage
FirstLevel();
}
}
Private function FirstLevel():void
{
//Also adding children and EventListeners, that affect the gameplay
Next_level_btn.addEventListener(MouseEvent.CLICK, clicked1);
function clicked1 (e:MouseEvent):void
{
clearEvents();
clearChild();
SecondLevel();
}
Main_Menu_btn.addEventListener(MouseEvent.CLICK, clicked1);
function clicked1 (e:MouseEvent):void
{
clearEvents();
clearChild();
Intro();
}
}
接下来的 20 个级别以此类推。
谢谢指教。