1

我来自 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);
}

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

jquery 我会做的。

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

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

     return false;

});

有人可以指出我正确的方向。

4

3 回答 3

3

我建议为您的 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另一种选择是使用可以在调度和使用时设置的属性创建您自己的事件类。这个过程相当漫长,所以这里有一个链接到我以前的答案之一,其中深入解释了实现它:

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

}

基本上,您创建一个包装函数,可以将您需要的任何参数传递给事件侦听器函数。

实现这一点的另一种方法是创建自己的类来扩展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 回答