0

混乱的标题,我的错。

基本上,我有一个名字列表。通过循环,我添加了一个 MovieClip,为其设置 2 个属性、名称和一个 ID。MovieClip 同时用作按钮,我添加了 4 个侦听器,鼠标向上、鼠标悬停、鼠标悬停或鼠标悬停。我对每个名字都这样做。每个设置的功能都是一样的。

例如:enemyButton[i].addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);

当我单击时,enemyID 有时会出现“无效属性”,它根本不会崩溃,但有时我必须按几次按钮。

我已将问题缩小到必须由听众引起。

函数很简单:

例如:函数mouseUpHandler(e:MouseEvent):void {enemySelected(e.target.enemyID); }

我的问题是,太多的听众可能是问题吗?我怎样才能减少它们?

这是循环的一个片段:

var C:Class = Class(getDefinitionByName(enemies[i]));
var c:* = new C(); 
c.gotoAndStop(1);
enemyButton[i].enemyID = i;
c.name = "select" + i;
c.enemyID = i;
trace(c.enemyID);
enemyButton[i].addChild(c);
enemyScroll.addChild(enemyButton[i]);
enemyButton[i].enemyName.text = info[i][Const.NAME];
enemyButton[i].setChildIndex(enemyButton[i].getChildByName("enemyName"), enemyButton[i].numChildren-1);

谢谢。

4

3 回答 3

0

如果enemyButton 是一个MovieClip(可能是通过attachMovie 创建的)并且没有强类型为EnemyButton 类,那么ID 属性将变为动态的。在这种情况下,如果您的名称列表包含不正确的数据(可能缺少 ID 字段),那么在某些 MovieClip 实例上 ID 属性将保持未定义。

您可以检查用于生成影片剪辑的数据列表。如果您的数据中有空行,您可能会遇到同样的错误。

这与事件侦听器无关。

于 2013-07-06T09:36:38.810 回答
0

所以你只想生成一堆具有独特属性的按钮,并知道最后点击的是哪个按钮。通常,在按钮对象之外实现按钮逻辑是非常糟糕的主意。为什么?因为您使用面向对象的语言。好消息是您使用 as3 并将函数视为对象,因此您可以像这样将函数分配给 var:

var callback:Function = function(name:String, enemyId:int){ /*do something*/ }

而且..您可以将函数作为参数传递给另一个函数

function setCalback(func:Function){}

button.setCallback(callback);

因此,您真正需要的是创建自己的按钮类,在其中添加侦听器,添加处理程序(静态处理程序将减少内存使用)并向其传递回调函数,当用户单击按钮时将调用该回调函数。

于 2013-07-06T11:59:15.580 回答
0

并不是要发送这么多垃圾邮件,但这很容易解决,尽管响应可能是更好的方法。

我只需要将目标更改为 currentTarget,然后允许单击“按钮”上的任何位置即可工作。而在此之前,目标因添加的孩子而异。

于是,解决了。

谢谢您的帮助。

于 2013-07-07T05:38:17.227 回答