1

私はphpjqueryのバックグラウンドを持っていますが、現在、flash as3を理解していますが、eventlistner関数に値を渡す方法がわかりません。

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);
}

ループにeventlistnerを追加する各小惑星は、var anote関数に異なる値を渡す必要がありますか?

jquery私はします。

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

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

     return false;

});

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

4

3 に答える 3

3

asteroidsAsteroidインスタンスのクラスを作成することをお勧めします(それが配列にあると仮定します)。それらの小惑星のそれぞれは、異なる値を持つプロパティを持つことができます(これはあなたの要素の属性anoteを密接に反映しています。.asteroidshref

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

その後:

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);
}

理想的には、Asteroidクラスには例のコードも含まれ、playSound()メソッドを処理するクラスを参照します。


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

于 2012-04-24T07:24:41.567 に答える
2

私が見つけた最も簡単な方法は、次の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);

}

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

これを実現するもう1つの方法は、それを拡張して使用する独自のクラスを作成するMouseEventことですが、これはより複雑です。

于 2012-04-24T07:22:31.637 に答える
0

オブジェクトまたはイベントの新しいクラスを毎回作成するのは面倒であり、無名関数を使用するのも不安定です。変数でそれをつかむだけです:

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));
}

その問題についてもこの回答を参照してください。

于 2012-11-22T09:32:13.813 に答える