玩家走过的对象不应该是libgdx java

时间:2015-10-20 04:50:38

标签: java libgdx

我的播放器由于某种原因能够穿过它不应该的物体。我正在使用一个2d布尔数组,如果在网格中左边的玩家的位置是真的,那么他就不能移动,同样也是正确的。我知道碰撞处理程序正在运行,因为它所做的就是检查左侧或右侧是否存在某些内容以及是否有写入 player.setCanMoveLeft 或右侧为false并且代码正常工作在以前的版本中。当玩家的左侧或右侧有东西时我打印出一些东西,所以我知道碰撞处理程序正在做它的工作。我只是不明白这里发生了什么是我的实体更新方法,哪个玩家扩展,

if(!wantsToMoveLeft && !wantsToMoveRight)
    velocity.x = 0;

if(velocity.x > 1){
    velocity.x = 1;
}if(velocity.x<-1)
    velocity.x = -1;

position.x += velocity.x;
spritePosition.x += velocity.x;
position.y += velocity.y;
spritePosition.y += velocity.y;

这是我的玩家更新方法,

if(wantsToMoveRight && canMoveRight)
    velocity.x = 1;
if(wantsToMoveLeft && canMoveLeft)
    velocity.x = -1;

if(wantsToJump && canJump){
    canFall = true;
    velocity.y += 1f;

    if(lastLeft){
        jumpLeft = true;
        jumpRight = false;
    }else{
        jumpRight = true;
        jumpLeft = false;
    }
}else if(canJump == false){
    jumpLeft = false;
    jumpRight = false;
}

super.update();

这也是我的输入监听器类

@Override
public boolean keyDown(int keycode) {
    if(keycode == Keys.A){
        player.setLastLeft(true);
        player.setLastRight(false);
        player.setWantsToMoveLeft(true);
        player.setWantsToMoveRight(false);
    }

    if(keycode == Keys.D){
        player.setLastRight(true);
        player.setLastLeft(false);
        player.setWantsToMoveRight(true);
        player.setWantsToMoveLeft(false);
    }

    if(keycode == Keys.W){
        player.setWantsToJump(true);
    }
    return false;
}

@Override
public boolean keyUp(int keycode) {
    if(keycode == Keys.A){
        player.setLastLeft(true);
        player.setLastRight(false);
        player.setWantsToMoveLeft(false);
    }
    if(keycode == Keys.D){
        player.setLastRight(true);
        player.setLastLeft(false);
        player.setWantsToMoveRight(false);
    }

    if(keycode == Keys.W){
        player.setWantsToJump(false);
    }
    return false;
}

如果有人能帮助我,我将非常感激,因为我完全失去了。如果您需要任何其他信息,请在评论中提出。谢谢你!!

更新 - 如果我走近对象(在击中它之前)并停止(放开键)然后尝试压制它就赢了让我动起来(即如果我这样做就行了)

注意 - 在我切换到使用 InputListener 之前,我认为这段代码可能有效,但这可能是假的,尽管我无法做到我记得很清楚,因为我从玩家更新中使用 Gdx.input 切换到通过 InputListener

进行通信后,我确实无法工作

1 个答案:

答案 0 :(得分:1)

我错过的简单解决方案与被告知无法移动时不执行停止有关。我无法解释为什么它之前有效,现在我需要这行代码,但是在这里,我将这些代码行放在我的播放器更新和方法中,现在它的工作非常精彩。

if(!canMoveLeft) {
    if(!wantsToMoveRight) {
        velocity.x = 0;
    } else {
        velocity.x = 1;
    }
}

if(!canMoveRight) {
    if(!wantsToMoveLeft) {
        velocity.x = 0;
    } else {
        velocity.x = -1;
    }
}

对于那些可能对此感到困惑的人感到抱歉,我感谢任何试图提供帮助的人!