我正在使用 XNA 制作一个简单的基于 2d 瓷砖的 RPG 游戏。我制作了一个简单的平铺地图,其中包含一个平铺对象列表,每个平铺包含一个矩形。我对玩家的移动更新首先会在下一帧中创建一个代表玩家的矩形。然后它运行一个 foreach 循环来检查图块列表中的每个图块是否与玩家矩形相交。如果是这样,它会将 collided 布尔值设置为 true,并且还会记住玩家将与之碰撞的瓷砖。
如果玩家将发生碰撞,它会设置玩家位置,以便玩家触摸瓷砖而不是进入它。我遇到的问题是不可能靠着瓷砖墙“滑动”。例如,如果我同时向下和向左移动,一旦我击中瓷砖,如果继续向左移动,玩家就会被卡住。无论我如何移动,您有什么想法可以改进该方法以使其正确运行吗?
public void MovementUpdate(KeyboardState ks, GameTime time, List<Tile> tlist)
    {
        Direction = Vector2.Zero;
        Rectangle nextPosRec;
        if (ks.IsKeyDown(Keys.Right)){
            Direction.X = MOVE_RIGHT;
        }
        if (ks.IsKeyDown(Keys.Down))
        {
            Direction.Y = MOVE_DOWN;
        }
        if (ks.IsKeyDown(Keys.Up))
        {
            Direction.Y = MOVE_UP;
        }
        if (ks.IsKeyDown(Keys.Left)){
            Direction.X = MOVE_LEFT;
        }
        Vector2 nextPos = Position ;
        nextPos += Direction * Speed * (float)time.ElapsedGameTime.TotalSeconds;
        nextPosRec = new Rectangle((int)nextPos.X, (int)nextPos.Y, 32, 32);
        bool colide = false;
        Tile ctile = new Tile(playerTexture, Position, 0);
        foreach (Tile t in tlist)
        {
            if (t.tileRectangle.Intersects(nextPosRec))
            {
                colide = true;
                ctile = t;
            }
        }
        if (colide == false)
        {
            Position = nextPos;
        }
        else
        {
            if (Position.Y < ctile.tileRectangle.Top - 32)
            {
                //COLLIDE TOP
                Position.Y = ctile.tileRectangle.Top - 32;
            }
            if(Position.Y > ctile.tileRectangle.Bottom)
            {
                //COLLIDE BOTTOM
                Position.Y = ctile.tileRectangle.Bottom;
            }
            if (Position.X < ctile.tileRectangle.Left - 32)
            {
                //COLLIDE LEFT
                Position.X = ctile.tileRectangle.Left - 32;
            }
            if (Position.X > ctile.tileRectangle.Right)
            {
                //COLLIDE RIGHT
                Position.X = ctile.tileRectangle.Right;
            }
        }
    }
感谢帮助!