使用 ActionScript 3.0 沿动画剪辑拖动

Drag along movieclip with ActionScript 3.0

如何沿着 BG(也是一个动画片段)拖动对象(一个动画片段)。 Moving/dragging BG 中的对象(影片剪辑)?

BG.addEventListener(MouseEvent.MOUSE_DOWN, DRAG);
BG.addEventListener(MouseEvent.MOUSE_UP, DROP);

function DRAG (e:MouseEvent) {
 object.x = e.localX;
 object.y = e.localY;
 //object.startDrag();

 //code to drag object(movieclip) along BG(movieclip)
}
function DROP (e:MouseEvent) {
 object.stopDrag();
 object.x = 0;
 object.y = 0;
}

Edited/New代码:

//bg(movieclip)
//obj(movieclip to drag)
//object2(movieclip)

var bounds: Rectangle = new Rectangle();
bounds.x = bg.x;
bounds.y = bg.y;
bounds.width = bg.width - obj.width;
bounds.height = bg.height - obj.height;

object2.x = obj.x;
object2.y = obj.y;

object2.addEventListener(TouchEvent.TOUCH_BEGIN, Drag);
object2.addEventListener(TouchEvent.TOUCH_END, Drop);

function Drag(event: TouchEvent): void {
    object2.x = e.LocalX;
    object2.y = e.LocalY;
    e.target.startTouchDrag(e.touchPointID);

    obj.x = e.localX;       
    obj.x = e.localY;   
    obj.startDrag(false, bounds);
}

function Drop(event: TouchEvent): void {
    End_Drag();
}

public function End_Drag():void {
    obj.stopDrag();
    obj.x = bound.x;
    obj.y = bound.y;

    object2.stopTouchDrag(object2.touchPointID);
    object.x = bound.x;
    object.y = bound.y; 
}

我将停止拖动事件函数分开,因为它可能在不同的地方被调用class。

在我编辑的代码中,当我 'TOUCH_DOWN' object2 时,obj 和 object2 都将其位置更改为我 'TOUCH_DOWN' 的位置并且没有拖动它们。当我 'TOUCH_END' object2 时,它重置了它们的位置。

P.S。此代码适用于我的虚拟操纵杆控制器。

创建两个对象:背景 bg 和要拖动的对象 obj

定义矩形区域。只能在此区域内移动对象。

var bounds: Rectangle = new Rectangle();
bounds.x = bg.x;
bounds.y = bg.y;
bounds.width = bg.width - obj.width;
bounds.height = bg.height - obj.height;

当鼠标按下时开始移动obj。鼠标悬停后停止移动

obj.addEventListener(MouseEvent.MOUSE_DOWN, objDown);

function objDown(event: MouseEvent): void
{
    obj.startDrag(false, bounds);

    stage.addEventListener(MouseEvent.MOUSE_UP, mouseUp);
    stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMove);
}

function mouseMove(event: MouseEvent): void
{
    //smooth moving
    event.updateAfterEvent();
}

function mouseUp(event: MouseEvent): void
{
    obj.stopDrag();

    stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUp);
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMove);
}

更新:

import flash.events.TouchEvent;
import flash.display.MovieClip;

var bounds: Rectangle = new Rectangle();
bounds.x = bg.x;
bounds.y = bg.y;

Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT; 

obj1.addEventListener(TouchEvent.TOUCH_BEGIN, objTouchBegin);
obj2.addEventListener(TouchEvent.TOUCH_BEGIN, objTouchBegin);

function objTouchBegin(event: TouchEvent): void
{
    bounds.width = bg.width - event.currentTarget.width;
    bounds.height = bg.height - event.currentTarget.height;

    event.currentTarget.startTouchDrag(event.touchPointID, false, bounds);

    stage.addEventListener(TouchEvent.TOUCH_END, touchEnd);
    stage.addEventListener(TouchEvent.TOUCH_MOVE, touchMove);
}

function touchMove(event:TouchEvent): void
{
    event.updateAfterEvent();
}

function touchEnd(event: TouchEvent): void
{
    event.currentTarget.stopTouchDrag(event.touchPointID);

    stage.removeEventListener(TouchEvent.TOUCH_END, touchEnd);
    stage.removeEventListener(TouchEvent.TOUCH_MOVE, touchMove);
}