0

我的问题如下:

我有一个由包含动态文本框 (text_txt) 和基本背景矩形的 MovieClip 组成的菜单。

我已经通过将所有项目名称放入一个数组并循环遍历它,为由实例名称(item1_mc 等)定义的每个项目分配了 MouseEvent.CLICK 的事件侦听器。

var menuItemsArray:Array = [item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12];

for(var i:int = 0; i < menuItemsArray.length; i++){
    menuItemsArray[i].text_txt.text = labelArray[i];
    menuItemsArray[i].addEventListener(MouseEvent.CLICK, menuItem_click);
}

...然后使用以下方法确定正在按下哪个(并从中删除文本):

function menuItem_click(e:MouseEvent){
    unit_name = e.target.text;
    }

...如果我直接单击 MovieClip 中的 TextField(返回文本),一切正常,但如果我单击 MovieClip 的边缘(以及动态文本框区域之外),它只会返回错误 #2007因为它试图从不包含文本的 [object menuItem_button_23] 中提取文本。

理想情况下,我想要发生的是,无论我在哪里单击 MovieClip 的“按钮”,我都会拉出文本,但我已经尝试过包括 e.currentTarget、e.target 以及两者的组合以及 .text , .text_txt.text 等等——但一切都以在外面有一个“死区”的问题告终。

此外,基本上我想要做的是创建一个包含标签文本的数组(通过内部文本字段)标记的电影剪辑“按钮”菜单。然后,当我单击按钮时,我想确定按下的是哪个按钮,并检索标签以允许我访问与所述标签文本相关的更多信息。

如果有人有解决方案,或者我正在尝试做的更好的方法,我会全神贯注。应该注意我的 AS3 经验/知识充其量只是平均水平,我很想学习一些新技术来完成我想做的事情。如果需要,我还可以提供更多信息。

谢谢!

4

3 回答 3

0

您必须检查您的目标是否实际上是一个 TextField。如果不是,那你就得参考text_txt里面了。

function menuItem_click(e:MouseEvent){
    if (e.target is TextField) unit_name = e.target.text;
    else {
        if (e.target.text_txt) unit_name=e.target.text_txt.text; 
        else unit_name='';
    }
}

这首先检查事件的实际目标是什么。如果它是一个 TextField,那么你点击了它,所以让我们获取它的文本。如果不是,那么它应该是一个 MovieClip,我们检查它是否分配了一个“text_txt”属性,因为如果是,它将是一个 TextField,所以我们从中取出文本。

于 2012-10-07T05:42:58.553 回答
0

您还可以做的是打开mouseChildren影片剪辑并在其上定义一个 getter/setter 对来读取/写入嵌套文本字段的文本。

在 Flash 库中的 MovieClip 中,将以下代码写入剪辑的其中一个图层

this.mouseChildren = false;

function get text():String { return text_txt.text; }
function set text(value:String):void { text_txt.text = value; }

第一行禁止你的movieclip 的任何子级成为鼠标事件的目标,并且单击movieclip 可见区域的某个位置会触发一个click-event,其target属性设置为movieclip。这统一了您必须处理事件的方式。

getter/setter 对封装了对文本字段text属性的访问,因此无需text_txt从影片剪辑外部读取/写入。

您的事件侦听器应该看起来像您预期的那样

function menuItem_click(e:MouseEvent):void {
    unit_name = e.target.text;
}

另外,使用这种方式text_txt在初始化时也不需要直接访问。您可以稍微简化一下 for 循环并编写:

for(var i:int = 0; i < menuItemsArray.length; i++){
    menuItemsArray[i].text = labelArray[i];
    menuItemsArray[i].addEventListener(MouseEvent.CLICK, menuItem_click);
}

希望这是一个最适合您需求的解决方案。告诉我,如果你有任何问题,或者什么时候忘记了什么。;)

于 2012-10-07T09:39:36.993 回答
0

应 32bitkid 的要求,我发布了我之前的评论作为答案:

尝试使用 e.currentTarget。使用 e.target 可以让您获得 CLICK 事件源自的显示列表中的原始项目。由于 CLICK 是一个冒泡事件,因此它通常不是您所指的 MovieClip,而是 MovieClip 的内部对象(因此 e.target 仅在您实际单击 TextField 时才在您的示例中工作)。如果您使用 e.currentTarget,您正在做的是检索您添加事件的对象,在这种情况下是外部 MovieClip,所以e.currentTarget.text_txt.text应该这样做......

于 2012-10-07T18:24:23.613 回答