AS3 Как найти текущее местоположение mc? - PullRequest
1 голос
/ 23 июня 2011

Спасибо за предложения startdrag (), но я пытаюсь избежать этого atm

Я пытаюсь создать движение перетаскивания, используя mouse_down, а затем mc = mouseX. Вот изображение ситуации

Но когда я нажимаю, mc всегда переходит к своей точке регистрации, которая является верхним левым углом atm.

Я не могу понять, как получить текущее местоположение mc. Обратите внимание, что mc (all_mc) шире сцены.

Может кто-нибудь, пожалуйста, помогите мне?

this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);

function mouseDownHandler(e:MouseEvent) {
    this.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
}

function mouseMoveHandler(e:MouseEvent) {
    all_mc.x = mouseX;
}

Edit:

Хорошо, я определил расположение мыши по оси x относительно точки регистрации mc (регистрация вверху слева):

Math.abs(stage.x - all_mc.x) + mouseX

Но как мне выбрать эту точку на MC?

Ответы [ 4 ]

0 голосов
/ 23 июня 2011
stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);

var positionX:Number = 0;
var positionY:Number = 0;
function mouseDownHandler(e:MouseEvent) {
    positionX = all_mc.mouseX;// save the x position for future reference
    positionY = all_mc.mouseY;// save the y position for future reference

    stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
}

function mouseMoveHandler(e:MouseEvent) {
    all_mc.x = stage.mouseX - positionX ;
    all_mc.y = stage.mouseY - positionY ;
}

function mouseUpHandler(e:MouseEvent) {
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
}
0 голосов
/ 23 июня 2011

startDrag () имеет аргумент lockCenter, с которым можно попробовать поиграть.

lockCenter:Boolean (по умолчанию = false) - указывает, является ли перетаскиваемый спрайт заблокирован центр положения мыши (true), или заблокирован до точки, где пользователь сначала щелкнул спрайт (false).


Без startDrag согласно комментарию


Сделать это базовым классом объекта, который вы хотите перетащить:

package
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.events.Event;

    public class Draggable extends Sprite
    {
        // vars
        private var _hx:Number = 0;
        private var _hy:Number = 0;

        /**
         * Constructor
         */
        public function Draggable()
        {
            addEventListener(MouseEvent.MOUSE_DOWN, _mouseDown);
        }

        /**
         * MouseEvent.MOUSE_DOWN
         */
        private function _mouseDown(e:MouseEvent):void
        {
            _hx = mouseX;
            _hy = mouseY;

            addEventListener(Event.ENTER_FRAME, _handle);
            addEventListener(MouseEvent.MOUSE_UP, _mouseUp);
        }

        /**
         * MouseEvent.MOUSE_UP
         */
        private function _mouseUp(e:MouseEvent):void
        {
            removeEventListener(Event.ENTER_FRAME, _handle);
            removeEventListener(MouseEvent.MOUSE_UP, _mouseUp);
        }

        /**
         * Event.ENTER_FRAME
         */
        private function _handle(e:Event):void
        {
            x = parent.mouseX - _hx;
            y = parent.mouseY - _hy;
        }
    }
}
0 голосов
/ 23 июня 2011

Модифицированный ответ Марти Уоллеса для обработки разницы между местом нажатия и точкой регистрации:

package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;

    public class DummyTest extends Sprite {

        private var mDeltaX:Number = 0;
        private var mDeltaY:Number = 0;

        private var mGfx:Sprite;

        public function DummyTest() {
            mGfx = new Sprite();

            with(mGfx.graphics) {
                beginFill(0x00FF00);
                drawRect(0, 0, 200, 200);
                endFill();
            }

            addChild(mGfx);

            addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
        }

        private function onMouseDown(e:MouseEvent) : void {
            mDeltaX = mGfx.x - mouseX;
            mDeltaY = mGfx.y - mouseY;

            addEventListener(Event.ENTER_FRAME, onEnterFrame);
            addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
        }

        private function onMouseUp(e:MouseEvent) : void {
            removeEventListener(Event.ENTER_FRAME, onEnterFrame);
            removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
        }

        private function onEnterFrame(e:Event) : void {
            mGfx.x = parent.mouseX + mDeltaX;
            mGfx.y = parent.mouseY + mDeltaY;
        }
    }

}

0 голосов
/ 23 июня 2011
import flash.events.MouseEvent;
import flash.display.Sprite;

var mc:MovieClip;
var sprite:Sprite = new Sprite  ;
sprite.graphics.beginFill(0x000000);
sprite.graphics.drawRect(0,0,100,100);
sprite.graphics.endFill();

this.addChild(sprite);

sprite.addEventListener(MouseEvent.MOUSE_DOWN,function(){
    sprite.startDrag();}
);
sprite.addEventListener(MouseEvent.MOUSE_UP,function(){
    sprite.stopDrag();}
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...