我正在尝试创建一个简单的函数来选择和拖动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;
}
答案 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;
}
并在鼠标上移除此事件处理程序。