Flash AS3 - StartDrag () внутри StartDrag () в дочернем клипе MovieClip

Привет всем, мой код указан ниже.

как видите, у меня есть MC контейнера, который я добавил на сцену. Я установил его ограничения перетаскивания с помощью Rectangle (). Затем я добавляю в контейнер дочерний мувиклип «кошка» и хочу, чтобы его тоже можно было перетаскивать. Однако как только я нажимаю на своего кота при тестировании MC. Он стреляет в точку x = 0 y = 0 на сцене и не движется.

Контейнер MC можно без проблем перемещать.

Если я удалю границы прямоугольника из контейнера, функция startdrag (). оба MC можно перетащить без каких-либо проблем.

любая помощь была бы потрясающей.

Благодарность

//panning ability
my_x = 800 - myImage.width;
my_y = 480 - myImage.height;

myWidth = 0 - my_x;
myHeight = 0 - my_y;

container.addEventListener(MouseEvent.MOUSE_DOWN, bgMouseDown);
container.addEventListener(MouseEvent.MOUSE_UP, bgMouseUp);

 function bgMouseDown(evt:MouseEvent):void
{
    var object = evt.currentTarget;
    object.startDrag(false, new Rectangle(my_x, my_y, myWidth ,myHeight));
}

 function bgMouseUp(evt:MouseEvent):void
{
    var object = evt.currentTarget;
    object.stopDrag();
}

//adding ze cat

cat = new ACat();
container.addChild(cat);
cat.x = 100;
cat.y = 400;


cat.addEventListener(MouseEvent.MOUSE_DOWN, catMouseDown);
cat.addEventListener(MouseEvent.MOUSE_UP, catMouseUp);


 function catMouseDown(evt:MouseEvent):void
{
    var object = evt.currentTarget;
    object.startDrag(false);
}

 function catMouseUp(evt:MouseEvent):void
{
    var object = evt.currentTarget;
    object.stopDrag();
}

person MWard    schedule 19.05.2011    source источник
comment
evt.stopPropagation () исправил мою проблему! опубликуйте это как ответ, и я отмечу это как единое целое.   -  person MWard    schedule 21.05.2011


Ответы (3)


Попробуйте evt.stopPropagation( ) в первой строке функции catMouseDown.

Также попробуйте cat.addEventListener(MouseEvent.MOUSE_DOWN, catMouseDown, true);

person The_asMan    schedule 22.05.2011

Я думаю, вам нужно проверить, что является currentTarget, потому что событие запускается для контейнера, когда вы перетаскиваете Cat mc

попробуйте что-нибудь вроде этого:

function bgMouseDown(evt:MouseEvent):void
{
    var object = evt.currentTarget;
    if(evt.currentTarget !=container) return;
    object.startDrag(false, new Rectangle(my_x, my_y, myWidth ,myHeight));
}
person Ben    schedule 19.05.2011

Удалите слушателей из контейнера и создайте базовый класс для перетаскиваемых объектов.

package
{
    import flash.display.Sprite;
    import flash.geom.Rectangle;
    import flash.events.MouseEvent;

    public class Dragable extends Sprite
    {
        // vars
        private var _rect:Rectangle;

        /**
         * Constructor
         */
        public function Dragable()
        {
            addEventListener(MouseEvent.MOUSE_DOWN, _drag);
            addEventListener(MouseEvent.MOUSE_UP, _drop);
        }

        /**
         * MOUSE_DOWN
         */
        private function _drag(e:MouseEvent):void
        {
            if(_rect != null) startDrag(false, _rect);
            else startDrag();
        }

        /**
         * MOUSE_UP
         */
        private function _drop(e:MouseEvent):void
        {
            stopDrag();
        }

        /**
         * Define a boundary Rectangle
         * @param rect The Rectangle to define
         */
        public function set boundaries(rect:Rectangle):void
        {
            _rect = rect;
        }
    }
}

У этого слишком много преимуществ, чтобы перечислять.

person Marty    schedule 19.05.2011