知道事件监听器来自哪个符号实例?

时间:2010-10-26 21:26:32

标签: flash actionscript-3 actionscript flash-cs5

我需要一些帮助!我毫不怀疑这是一个愚蠢的问题,我刚刚过度思考过这个问题。

我有一个MovieClip符号的一个“主”实例(让我们称之为Mountain)和一个附带的类。在程序流程中,我自动生成8个相同符号的其他实例,比方说,每个实例都有不同的填充颜色。当我点击其中一个自动生成的那个时,我希望主实例将颜色更改为自动生成的颜色。

因此,在另一个类中动态生成项目后,我为MouseClick添加了一个eventListener

var thisMountain=new Mountain; 
thisMountain.ChangeColor();
thisMountain.addEventListener(MouseEvent.CLICK, itemClicked);
this.addChild(thisMountain);

但是当我意识到eventListener没有办法告诉它调用的函数时,点击了该符号的WHICH实例。所以我把事件监听器添加到“Mountain”类中,但是即使单击主要类,它也会被调用。所以当创建实例来区分时我添加了一个布尔值,但这似乎是非常可怕的编码。

那我该怎么办?那个例子清楚了吗?我是否应该制作另一个扩展山地类别的课程?这样做的最佳方法是什么?

4 个答案:

答案 0 :(得分:4)

您可以执行以下操作:

item1.addEventListener(MouseEvent.CLICK, itemClicked);
item2.addEventListener(MouseEvent.CLICK, itemClicked);
item3.addEventListener(MouseEvent.CLICK, itemClicked);
...
...
function itemClicked(e:MouseEvent):void{
 trace((e.currentTarget as MyInstances).myColor);
}

但是如果您在单独的类中创建项目并且不知道实例,或者创建了多少等等。您可能希望查看“自定义事件”。单击时,您的项目将触发类似以下事件。

var myItemClickedEvt:MyCustomEvent = new MyCustomeEvent("itemClicked", myColor);

然后您可以收听“itemClicked”事件,然后执行以下操作:

function itemClicked(e:MyCustomeEvent):void{
     trace(e.myColor);
}

...但我可能只是混淆了这种情况......你可能只需要:

(e.currentTarget as MyInstances).myColor

答案 1 :(得分:2)

只需在您的山地类中添加一个id变量:

var thisMountain=new Mountain('id1'); 
thisMountain.ChangeColor();
thisMountain.addEventListener(MouseEvent.CLICK, itemClicked);
this.addChild(thisMountain);
function itemClicked(e:MouseEvent):void{
    trace((e.currentTarget as Mountain).id);
}

答案 2 :(得分:1)

也许我不了解您的情况,但为什么不能只使用event.target属性?这不是你需要的吗?假设Mountain扩展了DisplayObject,您应该引用相关对象。

例如:

thisMountain.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void {
    // do something with evt.target;
});

答案 3 :(得分:1)

不是一个愚蠢的问题,但幸运的是有一个简单的解决方案:
使用MouseEvent的目标属性 所以你的事件处理程序看起来像这样:

protected function itemClicked(e:MouseEvent):void {
    var clickedMountain:Mountain = e.target as Mountain; // cast target as a Mountain
    var mountainColor:Color = clickedMountain.mountainColor;

    // do something here to set the color of the main mountain
}

根据您的Mountain剪辑的设置方式,您可能需要使用 currentTarget 而不是目标来确保您获得Mountain,而不是它的孩子。