2011-05-19 47 views
0

如何检查点击是否在舞台上(不在舞台前的其他物体上 - 仅在没有其他物体的地方)或在舞台上movieclip(名称为“mcSlideHolder”)?AS3检查点击是在舞台还是动画片段

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”。 你会如何做到这一点?

感谢您的任何建议!

+0

好的,我很抱歉... mcSlideHolder有1个孩子,那个“instance235”就是那个孩子。这是一个位图对象... – haemse 2011-05-19 19:30:30

+1

不是将目标显示对象的name属性的值与字符串值进行比较,而是将目标显示对象直接与另一个显示对象进行比较。例如,不是测试'e.target.name == null',而是测试'e.target == stage'。 – Taurayi 2011-05-19 20:22:44

+0

重复的问题http://stackoverflow.com/questions/6062339/as3-click-event-added-to-stage-but-fires-when-clicking-on-a-movieclick – 2011-05-19 21:07:48

回答

4

通常情况下,当你想检测点击一个特定的影片剪辑,那是你添加监听到一个:

mcSlideHolder.addEventListener(MouseEvent.MOUSE_DOWN, onSlideHolderMouseDown); 

而不是

stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouse_Down); 

这听起来像你做后者;添加一个监听器到舞台上,并试图找出监听器功能中点击的内容。这没有什么不妥,如果有许多可能的事情需要点击,它甚至可以是有效的。但是在这种情况下,currentTarget总是会成为舞台,并且目标始终是您单击的事件。如果这确实是你如何有事情成立了,你会得到不同的结果 - 可能是你所期望的一个 - 如果你这样做:

mcSlideHolder.mouseChildren = false; 

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

+0

好吧,明白了......谢谢你的解释。事情是,我必须听舞台,因为舞台上有两个元素,除了这些元素外,我还想听点击。所以我所做的就是(像Taurayi告诉的那样)将目标与实际的舞台对象进行比较... – haemse 2011-05-19 21:37:42

+1

Taurayi在他的方法中是正确的。您应该使用实际的对象引用来进行标识比较,而不是像.name属性那样可能不是唯一的东西。这种方式更加健壮。 – 2011-05-20 17:12:12

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 

个人而言,我不会用这种方法去,但这个是最好的答案我可以给你方向,你似乎要与去。

+0

好的谢谢你!它有点矫枉过正,但有道理:-) – haemse 2011-05-19 21:48:21

相关问题