C# 厚壁二维迷宫中的碰撞检测

C# 厚壁二维迷宫中的碰撞检测,c#,winforms,2d,collision-detection,collision,C#,Winforms,2d,Collision Detection,Collision,我必须用Windows窗体为学校制作一个游戏。我的游戏包括一个用户必须通过迷宫。我试图阻止我的用户使用碰撞检测直接穿过墙壁,但由于用于表示墙壁的矩形形状不同,我被卡住了。这个问题可能与我的运动相似,但我相信这是完全不同的,因为我没有网格系统或图形地图 如你所见,墙壁相当厚。每面墙都由一个C#矩形表示,就像我的玩家形象(黄色小幽灵)一样。我知道如何使用C#的IntersectsWith(矩形r)方法确定玩家是否正在穿过这些墙,但我不确定如何使用这些信息来处理碰撞并阻止玩家穿过墙 以下是我尝试过的:

我必须用Windows窗体为学校制作一个游戏。我的游戏包括一个用户必须通过迷宫。我试图阻止我的用户使用碰撞检测直接穿过墙壁,但由于用于表示墙壁的矩形形状不同,我被卡住了。这个问题可能与我的运动相似,但我相信这是完全不同的,因为我没有网格系统或图形地图

如你所见,墙壁相当厚。每面墙都由一个C#
矩形表示,
就像我的玩家形象(黄色小幽灵)一样。我知道如何使用C#的
IntersectsWith(矩形r)
方法确定玩家是否正在穿过这些墙,但我不确定如何使用这些信息来处理碰撞并阻止玩家穿过墙

以下是我尝试过的:

这是我的实际动作代码。因为游戏是在WinForm中构建的,所以移动是由键盘事件触发的,例如
OnKeyPressed
onkeypup

    public void Move(Direction dir)
    {
        HandleCollision(); // Handle collision while player is trying to move.
        if (dir == Direction.NORTH)
        {                
            this.y -= moveSpeed;
        }
        if (dir == Direction.SOUTH)
        {                
            this.y += moveSpeed;
        }
        if (dir == Direction.EAST)
        {
            this.x += moveSpeed;
        }
        if (dir == Direction.WEST)
        {
            this.x -= moveSpeed;
        }
    }
这是我的碰撞方法,
HandleCollision()

private void HandleCollision()
{
//首先,检查玩家是否达到游戏的任何边界。
如果(此.x=748)
{
这个.x=748;
}
如果(此.y=405)
{
这个y=405;
}           
//第二,检查墙壁碰撞。
foreach(迷宫墙中的矩形墙)
{
if(播放角度与(墙)相交)
{
如果(player.X>wall.X){player.X+=wall.Width;}
如果(player.Xwall.Y){player.Y+=wall.Height;}
如果(player.Y

现在,上面的代码可以正常工作了。然而,由于玩家的坐标增加了墙的宽度/高度,这使得玩家在地图上进行了一些奇怪的碰撞传送,最终玩家在地图上弹跳。那么,实现碰撞检测系统的最有效方法是什么呢?该系统可以替换
if(playerRectangle.IntersectsWith(wall)){
块中的所有代码?

在移动中,保存当前位置,执行移动,检查碰撞,如果为真,则恢复旧位置

为此,HandleCollision将返回一个布尔值,对于每个成功的测试为true(成功=检测到碰撞),如果不满足任何条件,则返回false。该方法将根本不修改任何x或y值。为了反映其新功能,应将此方法重命名为CheckCollision


从你另一篇文章中的gif来看,你的游戏场地似乎被划分成了正方形,墙壁和精灵由多个正方形组成?那么你的移动应该以一个正方形的增量进行,直到达到预期的增量。对于每个正方形,必须检查碰撞

对于一个更高级的方法,每次移动只进行一次检查,您需要一些线性数学。碰撞检查需要当前点p和移动的增量d。您需要检查p和p+d之间的墙是否交叉。这通常由线性条件下的符号变化表示。对于p左侧的垂直墙W,如果d po到墙的输入,
P.x+d.x-(W.x+W.width)
将为负值。使用
W.x+W.width确定s
    private void HandleCollision()
    {
        // First, check to see if the player is hitting any of the boundaries of the game.
        if (this.x <= 0)
        {
            this.x = 0;
        }
        if (this.x >= 748)
        {
            this.x = 748;
        }
        if (this.y <= 0)
        {
            this.y = 0;
        }
        if (this.y >= 405)
        {
            this.y = 405;
        }           
        // Second, check for wall collision.

        foreach (Rectangle wall in mazeWalls)
        {
            if (playerRectangle.IntersectsWith(wall))
            {
                if (player.X > wall.X) { player.X += wall.Width; }
                else if (player.X < wall.X) { player.X -= wall.Width; }
                else if (player.Y > wall.Y) { player.Y += wall.Height; }
                else if (player.Y < wall.Y) { player.Y -= wall.Height; }                    
            }
        }
    }