我需要一些帮助!我毫不怀疑这是一个愚蠢的问题,我刚刚过度思考过这个问题。
我有一个MovieClip符号的一个“主”实例(让我们称之为Mountain)和一个附带的类。在程序流程中,我自动生成8个相同符号的其他实例,比方说,每个实例都有不同的填充颜色。当我点击其中一个自动生成的那个时,我希望主实例将颜色更改为自动生成的颜色。
因此,在另一个类中动态生成项目后,我为MouseClick添加了一个eventListener
var thisMountain=new Mountain;
thisMountain.ChangeColor();
thisMountain.addEventListener(MouseEvent.CLICK, itemClicked);
this.addChild(thisMountain);
但是当我意识到eventListener没有办法告诉它调用的函数时,点击了该符号的WHICH实例。所以我把事件监听器添加到“Mountain”类中,但是即使单击主要类,它也会被调用。所以当创建实例来区分时我添加了一个布尔值,但这似乎是非常可怕的编码。
那我该怎么办?那个例子清楚了吗?我是否应该制作另一个扩展山地类别的课程?这样做的最佳方法是什么?
答案 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,而不是它的孩子。