C# 碰撞成功了,但我没有';I don’我不知道怎么知道讨论的方向

C# 碰撞成功了,但我没有';I don’我不知道怎么知道讨论的方向,c#,collision-detection,monogame,tiled,C#,Collision Detection,Monogame,Tiled,我用我的地图做了一个碰撞,碰撞工作,但是当我的玩家发生碰撞时,我停止了玩家的移动,他不走了,因为我不知道如何在一个方向上停止玩家 这是播放器和地图下的我的代码冲突 public bool IsCollisionTile(Rectangle player) { foreach(Rectangle rect in this._collisionObject) { if (rect.Intersects(player)) { re

我用我的地图做了一个碰撞,碰撞工作,但是当我的玩家发生碰撞时,我停止了玩家的移动,他不走了,因为我不知道如何在一个方向上停止玩家

这是播放器和地图下的我的代码冲突

public bool IsCollisionTile(Rectangle player)
{
    foreach(Rectangle rect in this._collisionObject)
    {
        if (rect.Intersects(player))
        {
            return true;
        }
    }
    return false;
}
玩家不移动的代码在Game1类中

if (mapLoader.IsCollisionTile(player.getDestinationRect()))
{
        player.setCantWalk(true);
}
它是类Player.cs中的函数update和setCantWalk

private bool _cantWalk;

    public void Update()
    {
    this._destinationRectangle.X = (int)_position.X;
    this._destinationRectangle.Y = (int)_position.Y;
    this._destinationRectangle.Width = _texture.Width;
    this._destinationRectangle.Height = _texture.Height;
    if(Keyboard.GetState().IsKeyDown(Keys.Up))
            {
                if (_cantWalk == false)
                {
                    _position.Y--;
                }
            }
            else if (Keyboard.GetState().IsKeyDown(Keys.Down))
            {
                if (_cantWalk == false)
                {
                    _position.Y++;
                }
            }
            else if (Keyboard.GetState().IsKeyDown(Keys.Right))
            {
                if (_cantWalk == false)
                {
                    _position.X++;
                }
            }
            else if (Keyboard.GetState().IsKeyDown(Keys.Left))
            {
                if (_cantWalk == false)
                {
                    _position.X--;
                }
            }

        }

        public void setCantWalk(bool walk)
        {
            _cantWalk = walk;
        }

想帮助我

对于更简单的方法,您需要记录对象的移动。因此,在检查重叠时,您知道是什么运动导致了重叠。然后,为该对象设置变量cantWalkX或cantWalkY


更好的解决方案是检查碰撞表面以确定障碍物。这要求您更改“相交”例程以返回相交对象,并根据其相对位置防止在该方向上移动。例如,如果碰撞对象位于对象的右侧,请设置cantWalkXPositive。如果左侧有另一个,请将cantWalkXNegative设置为true等。

对于更简单的方法,您需要保留对象移动的记录。因此,在检查重叠时,您知道是什么运动导致了重叠。然后,为该对象设置变量cantWalkX或cantWalkY


更好的解决方案是检查碰撞表面以确定障碍物。这要求您更改“相交”例程以返回相交对象,并根据其相对位置防止在该方向上移动。例如,如果碰撞对象位于对象的右侧,请设置cantWalkXPositive。如果左侧有另一个,请将cantWalkXNegative设置为true等。

您可以尝试在X轴上移动播放机,进行碰撞检查,然后在Y轴上再次进行检查,并恢复导致检查的任何一个。。。看起来不太理想,但这是一个选项你好,但我是一个初学者,我不知道怎么做。你可以尝试在X轴上移动你的播放器,进行碰撞检查,然后在Y轴上再次进行检查,并恢复导致检查的任何一个。。。看起来不太理想,但这是一个选择你好,但我是一个初学者,我不知道怎么做