Actionscript 3.0:点击目标有一个奇怪的问题

时间:2012-06-12 06:20:23

标签: actionscript-3 mouseevent parent target

所以我在容器movieclip中生成了65个动画片段。 (它位于一个容器中,因为它存在于游戏中并且位于弹出窗口内。)MovieClip是通过访问库中的AS3链接MovieClip来创建的。每个都存储在MovieClip数组中。从那里我将一些文本信息(包括一些隐藏的文本)放入每个文本中并添加一些事件监听器。除了一件事,代码本身工作得很好。事件侦听器将目标作为MovieClip中的TextField之一而不是MovieClip本身接收。我绝对确定鼠标事件监听器已应用于动画片段。

for (var i:int = 0; i < mcArray.length; i++)
{
    mcArray[i] = new IDButton();
    MovieClip(mcArray[i]).tf1.text = String(ID1[i])
    MovieClip(mcArray[i]).tf2.text = String(ID2[i]);
    MovieClip(mcArray[i]).tf3.text = String(ID3[i]);
    MovieClip(mcArray[i]).tf1.selectable = false;
    MovieClip(mcArray[i]).tf2.selectable = false;
    MovieClip(mcArray[i]).tf3.selectable = false;
    MovieClip(mcArray[i]).tf1.visible = false;
    MovieClip(mcArray[i]).tf2.visible = false;
    MovieClip(mcArray[i]).name = "MC" + String(i);
    container.addChild(MovieClip(mcArray[i]));
    MovieClip(mcArray[i]).addEventListener(MouseEvent.CLICK, mcClickHandler);
    MovieClip(mcArray[i]).addEventListener(MouseEvent.ROLL_OVER, mcHoverHandler);
    MovieClip(mcArray[i]).addEventListener(MouseEvent.ROLL_OUT, mcOffHandler);
    MovieClip(mcArray[i]).x = 0;
    MovieClip(mcArray[i]).y = MovieClip(mcArray[i]).height * i;
}

(老实说,我不知道是否有多余的MovieClip。我想这表明我对flash一般缺乏信任。)

所以为了测试我在mcClickHandler函数中跟踪目标名称并且它一直返回“tf3”。

3 个答案:

答案 0 :(得分:4)

AS3中的事件有两个“目标”属性:targetcurrentTarget。如果一个人不工作,另一个人通常会工作。

基本上,target是鼠标单击的实际对象,而currentTarget是附加了侦听器的对象。

此SO问题中的更多信息:Difference between e.target and e.currentTarget

答案 1 :(得分:1)

尝试将mouseChildren设置为false

MovieClip(mcArray[i]).mouseChildren = false;

答案 2 :(得分:0)

我会选择一个更简单的版本;仅添加一个事件侦听器,并使用Event.target确定单击哪个项目(在容器内)。你可以聪明地使用它的类型(类)。假设所有按钮都扩展了一个名为IDButton的自定义类,它们都需要执行相同的操作(比如调用函数),但是使用基于它的id的参数。

如果按钮基本上应该做同样的事情,这是有帮助的,并且在同一个容器中没有很多其他类型的剪辑需要监听相同的鼠标事件。

package  
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;

    public class Test extends Sprite
    {
        public function Test()
        {
            // one listener for all clicks
            this.addEventListener(MouseEvent.CLICK, handleClick);
            this.addEventListener(MouseEvent.MOUSE_OVER, handleHover);
            this.addEventListener(MouseEvent.MOUSE_OUT, handleHover);
        }

        private function handleClick(event:MouseEvent):void
        {
            // you're need to be sure it's a IDButton
            if (event.target is IDButton)
            {
                var button:IDButton= event.target as IDButton; 
                this.showById(button.id); // let's say CustomButton has a public var 'id'
            }
        }

        private function showById(id:int):void
        {
            // do something
        }


        private function handleHover(event:Event):void
        {
            if (event.target is IDButton)
            {
                var button:IDButton = event.target as IDButton;
                switch (event.type)
                {
                    case MouseEvent.ROLL_OVER:
                    {
                        button.alpha = 0.8;
                        break;
                    }
                    case MouseEvent.ROLL_OUT:
                    {
                        button.alpha = 1;
                        break;
                    }
                }
            }
        }
    }
}

希望有所帮助。