0

我如何检查点击是在舞台上(而不是在舞台前面的其他对象上 - 只是在没有其他对象的地方)或电影剪辑(名称“mcSlideHolder”)上?

function onMouse_Down(e:MouseEvent):void
{
    trace("MouseDown occured");
    trace("MouseDown target: " + e.target.name);
    trace("MouseDown target.tostring: " + e.target.toString);
    trace("MouseDown currentTarget: " + e.currentTarget);
    if(e.target.name == null || e.target.name == "mcSlideHolder")
    {   
        this._userInput();
    }
}

我的问题是,单击舞台时 e.target.name 为空。单击 mcSlideHolder 时,e.target.name 为“instance235”。你会怎么做?

感谢您的任何建议!

4

2 回答 2

4

通常,当您想要检测对特定 MovieClip 的点击时,您可以将侦听器添加到:

mcSlideHolder.addEventListener(MouseEvent.MOUSE_DOWN, onSlideHolderMouseDown);

而不是

stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouse_Down);

听起来你在做后者;在舞台上添加一个监听器,并试图在监听器函数中找出点击了什么。这没有什么问题,如果有很多可能的东西可以点击,它甚至可以是高效的。但在这种情况下,currentTarget 始终是舞台,而目标始终是您单击的生成事件的对象。如果这确实是您设置事物的方式,那么您将获得不同的结果——可能是您所期望的结果——如果您这样做:

mcSlideHolder.mouseChildren = false;

我假设 mcSlideHolder 是实例名称。将 mouseChildren 设置为 false 将意味着 mcSlideHolder 将生成 MOUSE_DOWN 事件,而不是作为其子级的 instance235。

于 2011-05-19T19:45:47.743 回答
2

亚当史密斯的回答已经解释了为什么你会得到“instance235”,所以我将解释一个解决stage对象name属性等于 null 的方法。

您可以为该stage对象创建一个包装类,并为该类提供一个名为name. 包装器类也必须是的子类,EventDispatcher以便您可以覆盖它的addEventListener()方法并更改其功能,以便您将事件侦听器隐式添加到舞台对象和包装器对象。解释它的最好方法是向您展示我制作的一个示例:

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

    public class Main extends Sprite 
    {
        private var _stageWrapper:StageWrapper;

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);


            var stageWrapper:StageWrapper = new StageWrapper(stage, "stage");
            stageWrapper.addEventListener(MouseEvent.CLICK, onStageWrapperClick);

        }// end function

        private function onStageWrapperClick(e:MouseEvent):void
        {
            trace(e.target.name) // output: stage

        }// end function

    }// end class

}// end package

import flash.display.Stage;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.MouseEvent;

internal class StageWrapper extends EventDispatcher
{
    private var _stage:Stage;
    private var _name:String;
    private var _listener:Function;

    public function get stage():Stage { return _stage }
    public function get name():String { return _name }

    public function StageWrapper(stage:Stage, name:String) 
    { 
        _stage = stage;
        _name = name;

    }// end function

    override public function addEventListener(type:String, 
                                              listener:Function,
                                              useCapture:Boolean = false,
                                              priority:int = 0,
                                              useWeakReference:Boolean = false):void
    {

        super.addEventListener(type, listener, useCapture, priority, useWeakReference);
        _stage.addEventListener(type, onStageEvent, useCapture, priority, useWeakReference);

    }// end function

    private function onStageEvent(e:Event):void 
    {
        dispatchEvent(e);

    }// end function

}// end class

就我个人而言,我不会采用这种方法,但这是我可以为您提供的最佳答案,以了解您似乎正在采用的方向。

于 2011-05-19T21:32:38.007 回答