2011-05-19 82 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