AS3:为什么选择时MC会“颤抖”?

时间:2011-09-20 11:50:19

标签: actionscript-3

我正在尝试创建一个简单的函数来选择和拖动MovieClip,而不使用startDrag()函数。

我在舞台上有几个MC,当鼠标按下MC时,我希望MC随鼠标移动。但当我按住鼠标时,MC开始“颤抖”,我不知道为什么。

由于其他原因,我在每个MC中都有代码。以下是我到目前为止的情况:

var selectX:Number; //x coordinate of mouse click (to select right point on mc on mouse down)


this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
this.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);

function mouseDownHandler(e:MouseEvent):void {  
    selectX = this.x - mouseX;
    addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
}


function mouseUpHandler(e:MouseEvent):void {
    mouseX2 = mouseX;
    removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
}

function onEnterFrameHandler(e:Event):void {
    this.x = mouseX + selectX + stage.x;
}

3 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为您正在使用动画片段内部的mouseX。但是当您尝试设置movieClip的x时,它会在父动画片段上设置x。

e.g:

MainClip中 | - DragableButton

当你添加DragableButton.x = 100时,它是mainClip所在的x位置。 当您的代码在DragableButton中使用mouseX时,真正的mouseX = x + mouseX。并且因为DragableButton内部的mouseX等于例如20,您添加:selectX = this.x - mouseX - >如果你有selectX = 100 - 20.但不是100 - 120应该是。

所以,如果您仍想继续使用代码,请稍后更改一下:

var selectX:Number; //x coordinate of mouse click (to select right point on mc on mouse down)
var mouseX2:Number;


this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
this.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);

function mouseDownHandler(e:MouseEvent):void {  
    selectX = this.x - parent.mouseX;
    // selectX = this.x - stage.mouseX;
    addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
}


function mouseUpHandler(e:MouseEvent):void {
    mouseX2 = parent.mouseX;
    removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
}

function onEnterFrameHandler(e:Event):void {
    this.x = parent.mouseX + selectX;
    // this.x = stage.mouseX + selectX;
}

P.S。 stage.x = 0,它将永远。除非你改变财产。 p.s.s.阶段只是一个相同的实例,无论你想从哪个MC获得它。

我的建议是:

this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);

function mouseDownHandler(e:MouseEvent):void
{ 
    this.startDrag();
    stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
}


function mouseUpHandler(e:MouseEvent):void
{
    this.stopDrag();
    stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
}

答案 1 :(得分:0)

我认为movieclip正在颤抖,因为在你的拖动过程中,你的应用程序一直在调用mouseDownHandler,改变了selectX。

尝试删除MOUSE_DOWN事件侦听器。在mouseDownHandler中,首先要做的就是这样做(这也是防止内存泄漏的好方法)。您可以在鼠标向上时添加侦听器(然后删除鼠标向上侦听器)。

答案 2 :(得分:0)

为什么你使用Event.ENTER_FRAME事件(代价高昂),试着像这样使用MouseEvent.MOUSE_MOVE。

function mouse_move(e:Event)
{
   this.x = mouseX + selectX + stage.x;
}

并在鼠标上移除此事件处理程序。