Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法检测两个矩形是否碰撞C_C# - Fatal编程技术网

C# 无法检测两个矩形是否碰撞C

C# 无法检测两个矩形是否碰撞C,c#,C#,我正在用c语言编写程序室生成器,我希望这些房间不要重叠,我很难让它正常工作。在@Idle\u Mind的评论之后,我有了一个新问题。该程序生成的图像有许多重叠的房间。Bellow是应该处理交叉点检查和房间在tilemap上的放置的类 public int XSize, YSize; private Cell[ , ] cells; private List<Room> rooms; public Tilemap(int

我正在用c语言编写程序室生成器,我希望这些房间不要重叠,我很难让它正常工作。在@Idle\u Mind的评论之后,我有了一个新问题。该程序生成的图像有许多重叠的房间。Bellow是应该处理交叉点检查和房间在tilemap上的放置的类

        public int XSize, YSize;
        private Cell[ , ] cells;
        private List<Room> rooms;

        public Tilemap(int xSize, int ySize)
        {
            XSize = xSize;
            YSize = ySize;
            rooms = new List<Room>();
            cells = new Cell[XSize, YSize];

            for (int y = 0; y < YSize; y++)
            {
                for (int x = 0; x < XSize; x++)
                {
                    cells[x, y].type = CellType.Empty;
                }
            }

            for (int i = 0; i < 10; i++)
            {
                GenerateRandomRoomSafe(10);
            }
        }

        private Room GetRoomBounds()
        {

            Utils.Int2 min = new Utils.Int2(0, 0);
            Utils.Int2 max = new Utils.Int2(XSize,YSize);
            Utils.Int2 q1 = Utils.GetRandomCoords(min, max);

            max.X = XSize - 1 - q1.X;
            max.Y = YSize - 1 - q1.Y;

            Utils.Int2 siz = Utils.GetRandomCoords(min, max);
            Room check = new Room(q1.X, q1.Y, siz.X, siz.Y);


            return check;
        }

        public void GenerateRandomRoomSafe(int maxTries)
        {
            Room check = new Room(0, 0, 0, 0);
            bool isValid = false;
            int tries = 0;

            if (rooms.Count == 0)
            {
                isValid = true;
                check = GetRoomBounds();
                tries = 1;
            }
            else
            {
                while (!isValid && tries < maxTries)
                {
                    check = GetRoomBounds();
                    for (int i = 0; i < rooms.Count; i++)
                    {
                        if (!rooms[i].Walls.IntersectsWith(check.Walls))
                        {
                            isValid = true;
                            break;
                        }
                    }
                    tries++;
                }
            }

            if (isValid)
            {
                Console.WriteLine(check + " was placed after " + tries + " tries");
                PlaceRoomUnsafe(check);
            }
        }

        public void PlaceRoomUnsafe(Room r)
        {
            for (int y = r.Walls.Y; y <= r.Walls.Y + r.Walls.Height; y++)
            {
                cells[r.Walls.X, y].type = CellType.Wall;
            }
            for (int y = r.Walls.Y; y <= r.Walls.Y + r.Walls.Height; y++)
            {
                cells[r.Walls.X + r.Walls.Width, y].type = CellType.Wall;
            }
            for (int x = r.Walls.X; x <= r.Walls.X + r.Walls.Width; x++)
            {
                cells[x, r.Walls.Y].type = CellType.Wall;
            }
            for (int x = r.Walls.X; x <= r.Walls.X + r.Walls.Width; x++)
            {
                cells[x, r.Walls.Y + r.Walls.Height].type = CellType.Wall;
            }

            for (int y = r.Floor.Y; y < r.Floor.Y + r.Floor.Height; y++)
            {
                for (int x = r.Floor.X; x < r.Floor.X + r.Floor.Width; x++)
                {
                    cells[x, y].type = CellType.Floor;
                }
            }
            rooms.Add(r);
        }

        public void GenerateRandomRoomUnsafe()
        {
            Room r = GetRoomBounds();
            PlaceRoomUnsafe(r);
        }


        public int GetCellPixel(int x, int y)
        {
            return (int) cells[x, y].type;
        }


        public class Room
        {
            public Rectangle Walls;
            public Rectangle Floor;

            public Room(int q1X, int q1Y, int xSize, int ySize)
            {
                Walls.X = q1X;
                Walls.Y = q1Y;
                Walls.Width = xSize;
                Walls.Height = ySize;
                Floor.X = q1X + 1;
                Floor.Y = q1Y + 1;
                Floor.Width = xSize - 1;
                Floor.Height = ySize - 1;
            }

            public override string ToString()
            {
                return "[Walls: " + Walls + "\n Floor: " + Floor + "]";
            }
        }
    }
下图供参考

您在GeneratorDomainRoomSafe中的逻辑是向后的

在此代码块中:

while (!isValid && tries < maxTries)
{
    check = GetRoomBounds();
    for (int i = 0; i < rooms.Count; i++)
    {
        if (!rooms[i].Walls.IntersectsWith(check.Walls))
        {
            isValid = true;
            break;
        }
    }
    tries++;
}
你的意思是,如果它不与至少一个房间相交,那么它必须是有效的

仅仅因为它不与当前房间相交,并不意味着它不会与其他房间相交

它应该看起来更像:注意注释

while (!isValid && tries < maxTries)
{
    isValid = true; // assume it's good until proven otherwise
    check = GetRoomBounds();
    for (int i = 0; i < rooms.Count; i++)
    {
        if (rooms[i].Walls.IntersectsWith(check.Walls)) // if it DOES intersect...
        {
            isValid = false; // .. then set valid to false.
            break;
        }
    }
    tries++;
}
所以我们首先假设它是有效的,然后当我们遇到一个相交的房间时,我们将valid设置为false并停止for循环,这样就可以在没有超过尝试次数的情况下尝试另一个随机房间

它制作的一些地图:


我认为问题在于引用文章的一部分,他假设Y坐标从下到上增加,而在屏幕坐标中,这正好相反,因为Y从上到下增加。你不必重新发明轮子。使用和?@Idle\u注意我重新编写了代码,现在交叉点似乎不起作用,许多房间重叠。github上的代码已更新。github链接不工作。无论如何,在这里更新代码…看起来你只是在看X,Y坐标。你不需要包括宽度和高度吗?不使用矩形类会使代码变得不必要的复杂。