私は小さなフラッシュゲームに取り組んでいます。ゲームには 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 をオーバーライドし、すべてのリスナーを配列に追加します。2 番目の関数は、EventListeners がまだそこにある (以前は削除されていない) かどうかをチェックし、配列からすべてのリスナーを削除するだけです。
このコードは、ステージに割り当てられた EventListener に対して正常に機能します。ただし、EventListener が Object に直接割り当てられた場合、配列には追加されないため、後で自動的に削除されることはありません。
オブジェクトを削除すると、それに割り当てられたイベント リスナーも削除されます。しかし、そのオブジェクトを再度追加すると、リスナーが 2 回実行されます。レベルを自由に移動できるので、行ったり来たりできます。そして、あなたが戻ってきたとき、私は問題を受け取ります。実行中のイベント リスナーの量が 2 倍になるため、システムが過度に使用され、動作が遅くなります。
では、このコードを修正するか、Object に割り当てられた EventListeners をキャッチして最終的に削除する方法を教えてください。
コード:
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 レベルについても同様です。
アドバイスありがとう。