AS3如何查找mc的当前位置?

时间:2011-06-23 06:49:01

标签: actionscript-3

感谢您的startdrag()建议,但我正在努力避免这个问题

我正在尝试使用mouse_down创建拖动动作,然后使用mc = mouseX。这是an image of the situation

但是当我点击时,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;
}

编辑:

好的我有点计算出鼠标的x位置与mc的注册点有关(注册位于左上角):

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

但是如何在mc上选择那个点?

4 个答案:

答案 0 :(得分:0)

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();}
);

答案 1 :(得分:0)

startDrag()有一个lockCenter参数,你可以试试。

  

lockCenter:Boolean (默认=   false) - 指定是否   draggable精灵被锁定了   鼠标位置的中心(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;
        }
    }
}

答案 2 :(得分:0)

修改了Marty Wallace的答案来处理点击位置和注册点之间的区别:

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;
        }
    }

}

答案 3 :(得分:0)

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);
}