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 が null であることです。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 はその子である instance235 ではなく MOUSE_DOWN イベントを生成します。

于 2011-05-19T19:45:47.743 に答える
2

stageAdam smithの回答は、「instance235」を取得する理由をすでに説明しているので、オブジェクトの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 に答える