如何在as3的循环中为同一个movieClip添加不同的侦听器?

时间:2011-09-12 13:31:41

标签: flash actionscript-3 actionscript

我正在尝试编写一个程序的一部分,它通过使用for为相同的对象创建不同的侦听器,但问题是所有这些的结果是相同的,在下面你可以找到我的代码:

for( var i:int=0;i<10;i++){


    var obj =  new MyClass();
    obj.y = i*30;


    obj.addEventListener(MouseEvent.MOUSE_UP, function(e:MouseEvent){
        value = i.toString();
        trace(value);
    });

    myOtherMovieClip.addChild(obj);
}

我编写上面代码的目的是,通过单击第一个obj,程序在输出中写入0,通过单击第二个,写入1等等,但是此代码为所有对象提供了10。 / p>

我应该补充说,无论myOtherMovieClip区域中是否存在obj,通过单击该区域,我都得到相同的值。

任何想法都会受到赞赏, 谢谢

3 个答案:

答案 0 :(得分:1)

实现此目的的最佳方法是将值属性设置为MyClass对象。

或者,从技术上讲,如果y属性不变,你可以这样做:

var value:String = (e.target.y / 30).toString();

答案 1 :(得分:1)

为了直接解决您的问题,您可以这样做:

obj.addEventListener(MouseEvent.MOUSE_UP, function():Function{
    var value : String = i.toString();
    var listener : Function = function(e:MouseEvent):void{
        trace(value);
    }       
    return listener;
}());

答案 2 :(得分:0)

有一个简单的解决方法。你的对象。
当然,id必须是MyClass

的属性
for( var i:int=0;i<10;i++){
  var obj =  new MyClass();
  obj.y = i*30;

  obj.id = 'someMC_' + i
  obj.addEventListener(MouseEvent.MOUSE_UP, function(e:MouseEvent){
    var aVar:Array = e.target.id.split('_')
    trace(aVar[1]);
  });
  myOtherMovieClip.addChild(obj);
}