Java 2D游戏'网格运动'

时间:2014-05-06 02:49:37

标签: java libgdx 2d top-down

我正在使用libGDX试图制作一个自上而下的2D游戏,并沿着口袋妖怪的方向移动。但是,我不确定如何实现这一点。

我希望玩家能够按下一个键(即:箭头键或WASD)以便移动,但是,当玩家释放钥匙时,我不希望角色停止移动直到它和#39; s位置沿着由32x32像素正方形组成的单元格网格。

那么我将如何创造一个“看不见的”' 32x32像素单元格的网格,只要它位于其中一个单元格的顶部,我的角色才会停止移动?

到目前为止,我只进行了逐像素移动。其中,我考虑过我可以设置一个布尔值,说明角色是否在移动,如果角色落在正确的区域,只是改变它,但我还没有想到任何方法来实现它。

这是我用于我的逐像素移动的方法(libGDX覆盖了键输入,它根据玩家的边界框在哪里绘制精灵):

public void generalUpdate() {
    if(Gdx.input.isKeyPressed(Keys.A) || Gdx.input.isKeyPressed(Keys.LEFT)) {
        if (anim_current == Assets.anim_walkingLeft)
            if(player.collides(wall.bounds)) {
                player.bounds.x += 1;
            }
            else
                player.dx = -1;
        else
            anim_current = Assets.anim_walkingLeft;
        Assets.current_frame = anim_current.getKeyFrame(stateTime, true);
    }
    else if (Gdx.input.isKeyPressed(Keys.D) || Gdx.input.isKeyPressed(Keys.RIGHT)) {
        if (anim_current == Assets.anim_walkingRight)
            if(player.collides(wall.bounds)) {
                player.bounds.x -= 1;
            }
            else
                player.dx = 1;
        else
            anim_current = Assets.anim_walkingRight;
        Assets.current_frame = anim_current.getKeyFrame(stateTime, true);
    }
    else if (Gdx.input.isKeyPressed(Keys.W) || Gdx.input.isKeyPressed(Keys.UP)) {
        if (anim_current == Assets.anim_walkingUp)
            if(player.collides(wall.bounds)) {
                player.bounds.y += 1;
            }
            else
                player.dy = -1;
        else
            anim_current = Assets.anim_walkingUp;
        Assets.current_frame = anim_current.getKeyFrame(stateTime, true);
    }
    else if (Gdx.input.isKeyPressed(Keys.S) || Gdx.input.isKeyPressed(Keys.DOWN)) {
        if (anim_current == Assets.anim_walkingDown)
            if(player.collides(wall.bounds)) {
                player.bounds.y -= 1;
            }
            else
                player.dy = 1;
        else
            anim_current = Assets.anim_walkingDown;
        Assets.current_frame = anim_current.getKeyFrame(stateTime, true);
    }
    else {
        Assets.current_frame = anim_current.getKeyFrames()[0];
        player.dx = player.dy = 0;
    }

    player.bounds.x += player.dx;
    player.bounds.y += player.dy;
}

1 个答案:

答案 0 :(得分:0)

您的代码非常混乱,我不想尝试修复它,但一般情况下您可以解决问题:

有一个布尔值来表示你是否正在移动。我们称之为isMoving。还有一种存储方向的方法(可能是0到3之间的整数?)。我们称之为dir


按键时,将isMoving设为true。如果您与网格对齐,请将dir更新为您按下的键的方向。

如果您没有按住键,请将isMoving设置为false。

当您移动角色时,如果isMoving为真并且它们未与网格对齐,则移动是dir所代表的方向。如果它们与网格对齐,则将isMoving设置为false并且不要移动。


// Only including one key, process is same for others.
if (rightKey) {
    isMoving = true;
    if (aligned)
        dir = 0;
} /* chain other keys in here */ else {
    isMoving = false;
}

if (isMoving) {
    if (!aligned) {
        move(dir);
        render(dir);
    } else {
    }
}

我刚刚意识到它可能无法在其当前状态下工作:/。我希望这至少可以让你知道该怎么做。我会尝试再修改一下......