处理libgdx中的多点触控

时间:2014-08-05 19:06:51

标签: java android libgdx multi-touch

好吧所以我一直在尝试为我的libgdx游戏实现多点触控解决方案并遇到一些麻烦。基本上我在屏幕的左下象限中有一个dpad来控制我的角色的方向,并且在屏幕的剩余部分上想要处理滑动以使角色跳跃,冲击或向敌人扔东西。我最初考虑过在GestureListener中使用fling但是我已经被告知多点触控不支持fling并且从那时起开始使用pan来检测滑动。我目前遇到的问题是,如果我在使用滑动时手指在屏幕上(玩家正在移动并尝试跳跃),则传递到平移停止的指针似乎是不正确的(至少根据我的记录和理解)的实施) 无论如何这里是下面的代码和docs on gesture detector here的链接,如果有人可以帮助解释发生了什么,将不胜感激。

@Override
public boolean touchDown(float x, float y, int pointer, int button) {
    if (x < width / 3 && y > height / 2) {
        directionPointer= pointer;
        if(x< width/6){     
            controller.leftPressed();
            message=" driection TOUCH DOWN POINTER IS: " + pointer  + "the action pointer -> " +actionPointer +"directionPointer->"+ directionPointer;
            Gdx.app.log("INFO", message);   
        return true;
    }else{oller.rightPressed(); 
        message=" direction TOUCH DOWN POINTER IS: " + pointer  + "the action pointer -> " +actionPointer +"directionPointer->"+ directionPointer;
        Gdx.app.log("INFO", message);   
        return true;

    }       

}else{
    actionPointer= pointer;
    down_x=x;
    down_y=y;
    message= "Pointer value is" + actionPointer;
}

message="TOUCH DOWN POINTER IS: " + pointer  + "the action pointer -> " +actionPointer +"directionPointer->"+ directionPointer;
Gdx.app.log("INFO", message);   
return false;
}
@Override
public boolean touchUp(int x, int y, int pointer, int button) {

    if ( pointer == directionPointer) {         
        controller.leftReleased();
        controller.rightReleased(); 
        directionPointer=-1;
        return true;                
    }
    if (x < width / 3 && y > height / 2) {

        controller.leftReleased();
        controller.rightReleased(); 
        directionPointer=-1;
        message= "TOUCHUP pointer is ->"+ pointer + "actionPointer->"+ actionPointer + "directionPointer-> "+ directionPointer;
        Gdx.app.log("INFO", message);
            return true;                
    }

    message= "touchUP was detected";
    Gdx.app.log("INFO", message);
    return false;

}

@Override
public boolean panStop(float x, float y, int pointer, int button) {
    message="swipe not processed";
    if( pointer==actionPointer){
        delta_x= Math.abs(down_x -x);
        delta_y= Math.abs(down_y - y);
        if (delta_x < delta_y ){
            // this is an up or down value 
            if(down_x > x){
                controller.bobPunch();
                message = "SWIPE DOWNWARD " ;           
            }else {
                // swipe up 
                controller.bobJump();
                message = "SWIPE UPWARD " ;
            }           
        }else{
            if(down_y< y){
                controller.throwPressed();
                message=" SWIPE RIGHT";
                //swipe right ward 
            }else{
                controller.throwPressed();
                message=" SWIPE LEFT";
               // swipe left    
            }
        }
    }
    Gdx.app.log("INFO", message);
    message="panstop pointer is : " + pointer  + "the action pointer-> " +actionPointer + "directionPointer->" + directionPointer;
    Gdx.app.log("INFO", message);
    actionPointer=-1;
    // TODO Auto-generated method stub
    return true;
}

现在这是检测应该采取什么操作的相关代码(directionPointer和actionPointer是全局int初始化的广告-1)问题是panStop返回的指针不是我预期的,这里是一些输出日志用于显示正在发生的事情的不同触摸操作的文件:

案例1:按住屏幕左下角(bob向左移动):

direction TOUCHdOWN POINTER IS: 0 action pointer->-1 directionpointer->0

case2向上滑动(bob jumps)

TOUCHdOWN POINTER IS: 0 action pointer->0 directionpointer->-1
SWIPE UPWARD
panstop pointer is: 0 actionpointer->0 directionpointer->-1

案例3移动和跳转(这里是问题所在):

direction TOUCHdOWN POINTER IS: 0 action pointer->-1 directionpointer->0
TOUCHdOWN POINTER IS: 1 action pointer->1 directionpointer->0
swipe not processed
panstop pointer is: 0 actionpointer->1 directionpointer->0

现在是最后一行,虽然我无法向你证明这是问题,因为我平移的手指被注册为动作指针,方向指针(不离开屏幕)是返回的。 任何人都可以指出我做错了或者这是libgdx本身的错误还是我的代码本身更可能

`

1 个答案:

答案 0 :(得分:1)

你实际上可以做的是让DPAD成为连接到舞台的演员,而屏幕控制则由InputProcessor或GestureListener处理,并使用InputMultiplexer来组合它们:

InputMultiplexer im = new InputMultiplexer(stage, inputProcessor);
Gdx.input.setInputProcessor(im);

如果我没弄错的话,发送到InputMultiplexer的参数顺序计为优先级。这意味着在上面的情况下,舞台(DPAD)将在屏幕控制之前被优先考虑。所以在你的情况下,你可能想要切换它们。

我知道这对你来说可能不是一个好的解决方案,但我在一些游戏中一直这样做。