1

私は Actionscript 3 にかなり慣れていないので、質問があります。私はかなり単純な違いを見つけるゲームを行っており、for ループでクリック可能な違いにイベント リスナーを追加しています。私の目標は、違いをクリックすると、イベントリスナーも削除されることです。

これが私のコードです:

function addDifferences()
{
    for (var i = 1; i < 4; i++)
    {
        var difference = level1_left["level1_left_diff" + i];
        difference.alpha = 0;
        difference.addEventListener(MouseEvent.CLICK, onDifferenceClick);

        function onDifferenceClick(evt:Event):void
        {
            evt.currentTarget.alpha = 1;
            evt.currentTarget.play();
            found++;
            evt.currentTarget.removeEventListener(MouseEvent.CLICK, onDifferenceClick);
        }
    }
}

問題は、for ループの最後の要素 (差分) にしかアクセスできないため、最後のイベントリスナーしか削除できないことです。すべての要素のイベント リスナーを削除できるようにしたいと考えています。

これで私を助けてもらえますか?ありがとう!

4

2 に答える 2

2

後でループできる配列に要素を格納する必要があります。

var differences:Array = new Array(); //Class variable, or global if you don't use classes

function addDifferences()
{
    for (var i = 1; i < 4; i++)
    {
        var difference = level1_left["level1_left_diff" + i];
        difference.alpha = 0;
        difference.addEventListener(MouseEvent.CLICK, onDifferenceClick);

        differences.push(difference);
    }
}

//Don't create this function four time
function onDifferenceClick(evt:Event):void
{
    evt.currentTarget.alpha = 1;
    evt.currentTarget.play();
    found++;

    for (var i = 0; i < differences.length; i++)
    {
        differences[i].removeEventListener(MouseEvent.CLICK, onDifferenceClick);
    }

    //You can empty array afterwars, if you wish to start a new round (with addDifferences)
    differences = new Array();
}
于 2012-10-02T11:50:02.050 に答える
0

すべてのアイテムを配列にプッシュする必要はありません。正しい関数を removeEventListener に渡すだけです。あなたのコードでは、 removeEventListener へのすべての呼び出しは、最後に割り当てられたインライン関数を取得しています。次のような非インライン関数を作成するだけです。

function addDifferences()
{
    for (var i = 1; i < 4; i++)
    {
        var difference = level1_left["level1_left_diff" + i];
        difference.alpha = 0;
        difference.addEventListener(MouseEvent.CLICK, onDifferenceClick);
    }
}

function onDifferenceClick(evt:Event):void
{
    evt.currentTarget.alpha = 1;
    evt.currentTarget.play();
    found++; //assuming this is a global variable accessible from this function!!!
    evt.currentTarget.removeEventListener(MouseEvent.CLICK, onDifferenceClick);
}
于 2012-10-02T20:05:20.687 に答える