2012-04-24 5 views
1

を値を渡すために、私はPHPのjqueryの背景からだと私は現在、eventlistner関数に値を渡す方法だけでわからないフラッシュAS3でグリップを取得していますが、私は次のことを持っていると言います。どのようにフラッシュAS3でのEventListenerに

for (var i:uint = 0; i < asteroids.length; i++) 
{     
    asteroids[i].x = Math.random() * 450; 
    asteroids[i].y = Math.random() * 450; 
    asteroids[i].addEventListener(MouseEvent.MOUSE_UP, changeValue);    
} 

public function changeValue(event:MouseEvent):void 
{ 
    playSound(anote); 
    trace(event.currentTarget); 
} 

は私がするvar anote関数に異なる値を渡す必要がループでaddeventlistner各小惑星?

jqueryとします。

$(".asteroids").click(function() { 

    // or something similar 
    var anote = $(this).attr('href'); 
    playSound(anote); 

    return false; 

}); 

誰かが正しい方向に向けることができますか?

答えて

2

私は(それがasteroids配列に何があるかだと仮定して)あなたの小惑星インスタンスに対応するクラスを作る示唆しています。 。これらの小惑星のそれぞれが、その後

public class Asteroid extends Sprite 
{ 
    public var anote:String = ""; 
} 

これは密接にあなたの.asteroids要素href属性を反映している(異なる値でanote性質を持っている可能性があり:

理想的
for each(var i:Asteroid in asteroids) 
{     
    i.x = Math.random() * 450; 
    i.y = Math.random() * 450; 
    i.addEventListener(MouseEvent.MOUSE_UP, changeValue);    
} 

public function changeValue(event:MouseEvent):void 
{ 
    playSound((event.currentTarget as Asteroid).anote); 
} 

を、あなたの小惑星クラスものコードが含まれますあなたの例と参照はplaySound()メソッドを扱うクラスのいずれかを扱います。


別のオプションは、ディスパッチ時に設定して使用できるanoteプロパティを持つ独自のイベントクラスを作成することです。プロセスは、非常に長いですので、ここでそれを実装の詳細な説明と私の以前の回答の1へのリンクです:

1

私が見つけた最も簡単な方法は、addEventListenerラインで関数を作成することです:

for (var i:uint = 0; i < asteroids.length; i++) 
{ 

    asteroids[i].x = Math.random() * 450; 
    asteroids[i].y = Math.random() * 450; 
    asteroids[i].addEventListener(MouseEvent.MOUSE_UP, function(e:MouseEvent){ 
     changeValue(e, otherArguments); 
    }); 

} 



public function changeValue(event:MouseEvent, otherArguments:Object):void 
{ 

    playSound(anote); 
    trace(event.currentTarget); 

} 

基本的には、イベントリスナー関数に必要な任意の引数を渡すことができますラッパー関数を作成します。

これを達成するための他の方法はMouseEventを拡張する独自のクラスを作成し、それを使用することであるが、これは、より複雑です。

+0

あなたがそこに作成している匿名機能が私には本当に不安を感じさせます。また、 'Object'は大文字の' O'を必要とします:) – Marty

+0

これは、ラッパーを保持するための追加メモリ使用量を得るため、悪い習慣です。 – Yarg

+0

@ Yarg私はこれが望ましい結果を達成するための素晴らしい方法ではないことを知っていますが、元のコードを修正する必要はありません。私はちょうどopが新しいクラスを作ることや再設計することなく、彼が持っているコードに合った解決策を望むと思った。 – annonymously

1

これは、オブジェクトの新しいクラスを作成するために面倒なのですか毎回イベントが発生し、匿名関数を使用するのは不安定です。ただ、変数にそれをつかむ:

var listeners:Object = new Object(); 

for (var i:uint = 0; i < asteroids.length; i++) { 
    asteroids[i].x = Math.random() * 450; 
    asteroids[i].y = Math.random() * 450; 
    listeners[i] = changeValue(asteroids[i].anote); 
    asteroids[i].addEventListener(MouseEvent.MOUSE_UP, listeners[i]); 
} 

public function changeValue(anote:Sound):Function { 
    return function(event:MouseEvent):void { 
    playSound(anote); 
    trace(event.currentTarget); 
    } 
} 

その後、後でリスナーを削除するには:

for (i = 0; i < asteroids.length; i++) { 
    //trace("asteroid" + i + " (before): " + asteroids[i].hasEventListener(MouseEvent.MOUSE_UP)); 
    asteroids[i].removeEventListener(MouseEvent.MOUSE_UP, listeners[i]); 
    //trace("asteroid" + i + " (after): " + asteroids[i].hasEventListener(MouseEvent.MOUSE_UP)); 
} 

はあまりにもその問題にthis answerを参照してください。

関連する問題