如何将值传递给flash as3中的eventlistener

时间:2012-04-24 07:13:27

标签: actionscript-3 flash events parameters addeventlistener

我来自php jquery背景,我目前正在处理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);
}

我在循环中的addeventlistner的每个小行星我需要将不同的值传递给var anote函数吗?

jquery我愿意。

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

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

     return false;

});

有人能指出我正确的方向。

3 个答案:

答案 0 :(得分:2)

我建议为你的Asteroid实例创建一个类(假设它是asteroids数组中的内容)。每个小行星都可能具有anote属性,其值不同(这会严重反映您的.asteroids元素href属性。

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)

我发现最简单的方法是在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的类并使用它,但这更复杂。

答案 2 :(得分: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