根据瓷砖移动角色

时间:2016-05-03 17:48:43

标签: c# xna

在我之前的帖子中,我提到在空闲时间使用XNA库学习C#,情况总是如此;然而,我已经长时间陷入了一些我在麻烦中弄清楚的事情!

这是当前情况的简历,实际上我的角色每2个像素移动2个,这个值存储在我在 Player.cs 中称为“速度”的变量中:

private Texture2D texture;
private Vector2 position, previousPosition;
private Rectangle sourceRect;
private KeyboardState currentInput, previousInput;

private int currentFrame = 0, frameLine = 0;
private float speed = 2f, elapsedTime, animationTime = 128f;

(顺便说一下,我输入的是Azerty键盘的ZQSD; D)

public void Update(GameTime gameTime)
{
    currentInput = Keyboard.GetState();

    if (currentInput.IsKeyDown(Keys.Z))
    {
        if (!Map.isColliding(position.X, position.Y - speed))
            position.Y -= speed;

        this.Animate(gameTime, 3);
    }
    else if (currentInput.IsKeyDown(Keys.Q))
    {
        if (!Map.isColliding(position.X - speed, position.Y))
            position.X -= speed;

        this.Animate(gameTime, 1);
    }
    else
        sourceRect = new Rectangle(32, (32 * frameLine), 32, 32);

    previousInput = currentInput;
}

public void Animate(GameTime gameTime, int m_frameLine)
{
    elapsedTime += (float)gameTime.ElapsedGameTime.TotalMilliseconds;
    frameLine = m_frameLine;

    if (elapsedTime > animationTime)
    {
        if (currentFrame >= 2)
            currentFrame = 0;
        else
            currentFrame++;

        elapsedTime = 0;
    }

    sourceRect = new Rectangle((32 * currentFrame), (32 * frameLine), 32, 32);
}

Map.cs 使用Tile设置构建整个地图,当然因为我很难找到“好”逻辑,所以我一直在观看YouTube上的教程,所以这里是无论如何结果:

MAP PREVIEW

现在我可以解释一下我要去哪里了! 我可以正常地穿过地图,碰撞可以工作,但是当角色想要在两个碰撞瓦片之间(例如墙壁之间)时,如果左边或右边有一个单个像素(或者向上和向上),它将无法工作下来,取决于方向):

这是因为角色的速度一次只有两个像素,有时候(大多数时候总是)让他完美地在中间穿过这段文章是有点棘手的。

所以我的问题是,我怎么能处理播放器的位移,以便保持速度,但只停止每32个像素等等?我一直在尝试这么多的可能性,它不再有趣,我陷入了逻辑困境,我肯定会以错误的方式看待,无用......

如果有人可以通过这种情况,从哪里开始或修改什么来启发我,我将非常感谢,也感谢您阅读我!

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你应该根据玩家的实际位置计算你指定的未来位置,然后转向未来的位置。换句话说:您的玩家的位置存储在Vector2中。因此,您需要根据要移动的位置计算下一个位置。因此,如果你想向右移动,计算actual_position + new Vector2(32,0),左边你需要actual_position + new Vector2(-32,0),顶部为actual_position + new Vector2(0,32),对于bot actual_position + new Vector2(0,-32)。然后只需应用速度,如果玩家达到计算向量,只需停止移动