1

Sprite要素の行を作成しています。すべてのスプライト要素は、クリックされたときに異なるジョブを持っています。addEventListenerどのボタンがクリックされたかを知るために内部の関数を作成するにはどうすればよいですか?

この場合、クリックした時の のtraced値は です。6 は配列の最後の要素にすぎないため、これは間違っています。それらの残り、最初はどうですか?ialways 6

for (var i:int = 0; i < 6; i++) {
    var barPart:Sprite = new Sprite();
    barPart.x = i * (30);
    barPart.y = 0;
    barPart.graphics.beginFill(0x000000, 0.2);
    barPart.graphics.drawRect(0, 0, 10, 10);
    barPart.graphics.endFill();

    barPart.addEventListener(MouseEvent.CLICK, function(_event:MouseEvent):void {
         trace(i);
    });
}
4

3 に答える 3

3

アプリケーションがビルドされ、リスナーが追加されると、ループはすでに実行されているため、ユーザーがボタンをクリックするまでに、インデックス "i" は常に 6 になります。異なる項目を区別するには、示されているように「name」プロパティ (DisplayObject の prop) を使用します ... ループ内のメソッド クロージャーとしてリスナー関数を使用しないようにしてください。代わりに、次のようにします。

for (...)
{
    ... code
    barPart.name = "barPart-" +i;
    barPart.addEventListener(MouseEvent.CLICK, barPart_clickHandler);
}

次のような関数(イベントハンドラーを個別に)を実装します。

private function barPart_clickHandler(e:MouseEvent):void
{
    // the event's target will let you know who dispatched the function
    var name:String = Sprite(e.currentTarget).name;
    name            = name.replace("barpart-", "");
    switch(name)
    {
        case '0':
            // your code
            break;
        .
        .
    }
}
于 2013-11-10T09:01:42.563 に答える
0

@Shally Virk - 私の間違い。動的オブジェクトである MovieClip を考えていたので、任意のフィールドを追加できます。そうです、この問題を回避する方法はたくさんありますが、あなたの提案はうまくいきます。

于 2013-11-12T01:03:52.917 に答える