AS3 проверяет, был ли клик на сцене или клип - PullRequest
0 голосов
/ 19 мая 2011

Как я могу проверить, был ли клик на сцене (не на другом объекте перед сценой - просто на месте, где нет другого объекта) или на видеоклипе (имя "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». Как бы вы это сделали?

Спасибо за любой совет!

Ответы [ 2 ]

4 голосов
/ 19 мая 2011

Обычно, когда вы хотите обнаружить клик по определенному мувиклипу, это тот, к которому вы добавляете слушателя:

mcSlideHolder.addEventListener(MouseEvent.MOUSE_DOWN, onSlideHolderMouseDown);

вместо

stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouse_Down);

Звучит так, будто вы делаете последнее; добавление слушателя на сцену и попытка выяснить в функции слушателя, на что нажали. В этом нет ничего плохого, и это может быть даже эффективно, если есть много возможных вещей, на которые можно нажать. Но в этом случае currentTarget всегда будет сценой, а цель всегда будет той, на которую вы нажали, чтобы сгенерировать событие. Если это действительно так, как вы настроили, вы получите другой результат - возможно, тот, который вы ожидали - если вы сделаете это:

mcSlideHolder.mouseChildren = false;

Я предполагаю, что mcSlideHolder - это имя экземпляра. Если для mouseChildren установлено значение false, mcSlideHolder будет генерировать событие MOUSE_DOWN, а не instance235, являющийся его дочерним.

2 голосов
/ 20 мая 2011

Ответ Адама Смита уже объясняет, почему вы получаете «instance235», поэтому я объясню обходной путь для stage свойства объекта name, равного нулю.

Вы можете создать класс-оболочку для stage возьмите объект и передайте этому классу свойство с именем name.Класс-обертка также должен быть подклассом EventDispatcher, чтобы вы могли переопределить его метод addEventListener() и изменить его функциональность, чтобы неявно добавлять прослушиватель событий в объект stage и в объект-оболочку.Лучший способ объяснить это - показать вам пример, который я сделал:

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

Лично я не согласился бы с таким подходом, но это лучший ответ, который я могу дать вам для направления, которое вам кажетсясобирается с.

...