2012-04-24 75 views
1

我来自php jquery背景,我目前正在处理flash as3只是不知道如何将值传递给eventlistner函数说我有以下几点。如何将值传递给闪存中的eventlistener as3

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; 

}); 

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

回答

2

我建议为你的小行星实例做一个类(假设这是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); 
} 

理想情况下,你的小行星类也将包含在代码你的例子和参考无论哪一类处理方法


另一种选择是使用anote属性创建您自己的事件类,您可以在派发和使用中设置该属性。这个过程是相当漫长的,所以这里是我以前的答案的一个链接与实施是一个深入的解释:

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 2012-04-24 07:27:20

+0

这是一个不好的做法,因为你将获得额外的内存使用来保存包装,Marty Wallace建议更好的方法。 – Yarg 2012-04-24 07:27:52

+0

@Yarg我知道这不是一个很好的方式来实现预期的结果,但它需要对原始代码进行最少的修改。我只是认为,操作系统会希望有一个适合他的代码的解决方案,而不必重新设计或重新设计。 – annonymously 2012-04-24 07:29:11

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了。