将 MovieClip 移动到 Left/Right 使用同时触摸的触摸事件

Moving A MovieClip to Left/Right Using Touch Events with simultaneous touches

我正在开发一款针对 android 和 ios 的游戏 AS3 Adob​​e air,其中中间有一个影片剪辑,还有两个按钮(左右)应该移动那个影片剪辑。我的目标是使 left/right 之间的转换尽可能平滑:
- 如果播放器正在触摸左按钮,则影片剪辑向左移动。如果他从左边的按钮上移开手指,然后立即触摸右边的按钮,影片剪辑将不会移动,直到他重新触摸右边的按钮,影片剪辑才会向右移动。我试图实现多点触控事件,但我似乎遇到了问题,因为这是我得到的行为。
- 如果玩家正在触摸左按钮,影片剪辑将按预期向左移动,如果他触摸右键,影片剪辑将按预期停止,但如果他将手指从左按钮上移开,同时将手指放在右按钮上,影片剪辑仍然冻结并且不动,它应该向右移动
这是我正在使用的代码:

leftButtonCreated.addEventListener(TouchEvent.TOUCH_BEGIN,mouseDown);
rightButtonCreated.addEventListener(TouchEvent.TOUCH_BEGIN,mouseDown2);
stage.addChild(leftButtonCreated);
stage.addChild(rightButtonCreated);

function mouseDown(e:TouchEvent):void
        {

            stage.addEventListener(TouchEvent.TOUCH_END,mouseUp1);
            //listen for mouse up on the stage, in case the finger/mouse moved off of the button accidentally when they release.;
            addEventListener(Event.ENTER_FRAME,myButtonClick);//while the mouse is down, run the tick function once every frame as per the project frame rate
        }

        function mouseUp1(e:TouchEvent):void
        {

            removeEventListener(Event.ENTER_FRAME,myButtonClick);//stop running the tick function every frame now that the mouse is up
            stage.removeEventListener(TouchEvent.TOUCH_END,mouseUp1);
        }

        function mouseDown2(e:TouchEvent):void
        {

            stage.addEventListener(TouchEvent.TOUCH_END,mouseUp2);
            //listen for mouse up on the stage, in case the finger/mouse moved off of the button accidentally when they release.;
            addEventListener(Event.ENTER_FRAME,stopDragging);//while the mouse is down, run the tick function once every frame as per the project frame rate
        }

        function mouseUp2(e:TouchEvent):void
        {

            removeEventListener(Event.ENTER_FRAME,stopDragging);//stop running the tick function every frame now that the mouse is up
            stage.removeEventListener(TouchEvent.TOUCH_END,mouseUp2);
        }

    function stopDragging(ev2:Event):void
    {

        if (MC.x <= rightButtonCreated.x)
        {
            MC.x = MC.x + 10;
        }


    }

    function myButtonClick(ev:Event):void
    {


        if (MC.x > leftButtonCreated.x)
        {
            MC.x = MC.x - 10;

        }
        else
        {



        }

    }

代码最初是为 mouseEvents 设置的,所以我试图切换到触摸事件,这样我就可以解决这个问题,上面的代码就是我得到的。谢谢你的时间。

编辑:

而且,我使用以下代码:

var leftButtonCreated:leftB= new leftB();

您当前的问题是,一旦您松开左键,mouseUp1mouseUp2 都会被触发,因为它们都连接到舞台上。但你的实际问题更深。如果按下相应的按钮,您应该先左右移动object,然后使用TouchEvent.touchPointID跟踪释放了哪个触摸,以了解释放了哪个按钮。

还有一个潜在的注意事项:如果您同时触摸左右按钮,然后交换手指同时保持两个触摸,然后松开右按钮上方的手指 - object 应该向左还是向右移动?我说正确答案是在右边,因为松开的手指对应的是左键。

leftButtonCreated.addEventListener(TouchEvent.TOUCH_BEGIN,touchDown);
rightButtonCreated.addEventListener(TouchEvent.TOUCH_BEGIN,touchDown);
leftButtonCreated.addEventListener(TouchEvent.TOUCH_END,touchUp);
rightButtonCreated.addEventListener(TouchEvent.TOUCH_END,touchUp);
addEventListener(Event.ENTER_FRAME,moveObject);

function touchDown(e:TouchEvent):void {
    var button:DisplayObject=e.currentTarget as DisplayObject; 
    if (!button) return; // can't fail typecast to DisplayObject in this context, but leave for good measure
    if (button==leftButtonCreated) {
        leftButtonPressed=true;
        leftButtonTouchID=e.touchPointID;
        return;
    }
    if (button==rightButtonCreated) {
        rightButtonPressed=true;
        rightButtonTouchID=e.touchPointID;
        return;
    }
}
function touchUp(e:TouchEvent):void {
    var button:DisplayObject=e.currentTarget as DisplayObject;
    if (!button) return;
    var ti:int;
    if (button==leftButtonCreated) {
        ti=leftButtonTouchID; 
        if (ti==e.touchPointID) {
            leftButtonPressed=false;
        }
    }
    if (button==rightButtonCreated) {
        ti=rightButtonTouchID;
        if (ti==e.touchPointID) {
            rightButtonPressed=false;
        }
    }
}
function moveObject(e:Event):void {
    if (leftButtonPressed) MC.x-=10;
    if (rightButtonPressed) MC.x+=10;
    if (MC.x<leftButtonCreated.x) MC.x=leftButtonCreated.x;
    if (MC.x>rightButtonCreated.x) MC.x=rightButtonCreated.x;
}

编辑:显然 SimpleButton 不允许事件传播到他们的 parents 之外。好的,这仍然可以解决,但是您必须将所需的属性存储在 Main class.

var leftButtonPressed:Boolean=false;
var rightButtonPressed:Boolean=false;
var leftButtonTouchID:int=0;
var rightButtonTouchID:int=0;

以上代码已更新。请 return 直接使用 SimpleButtons,就像您使用 var leftButtonCreated:leftB= new leftB(); 一样。