0

我正在使用 libGDX 尝试制作一个自上而下的 2D 游戏,并沿着 Pokemon 的路线移动。但是,我不确定如何实现这一点。

我希望玩家能够按下一个键(即:箭头键或 WASD)以移动,但是,当玩家释放键时,我不希望角色停止移动,直到它的位置落在网格上由 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;
}
4

1 回答 1

1

您的代码非常混乱,我不想尝试修复它,但通常可以通过以下方式解决您的问题:

如果您正在移动,请使用布尔值表示。让我们称之为isMoving。还有一种存储方向的方法(可能是0到3之间的整数?)。让我们称之为dir


当你按下一个键时,设置isMoving为true。如果您与网格对齐,请更新dir到您按下的键的方向。

如果您不持有密钥,请设置isMoving为 false。

当你开始移动你的角色时,如果isMoving为真并且它们没有与网格对齐,那么 move 是由 表示的方向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 {
    }
}

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

于 2014-05-06T03:15:53.420 回答