我在下面的代码中遇到了一个奇怪的问题(我已经删除了那些无关紧要的部分,并且所引用的任何类/函数都按预期工作):
int curNumRooms = 0;
while(curNumRooms < numberOfRooms) {
int w = Random.Range(minimumRoomSize, maximumRoomSize+1);
int h = Random.Range(minimumRoomSize, maximumRoomSize+1);
int x = Random.Range(0, (int)levelSize.x - w - 1);
int y = Random.Range(0, (int)levelSize.y - h - 1);
Rectangle newRoom = new Rectangle(x,y,w,h);
bool failed = false;
foreach (Rectangle otherRoom in rooms) {
if(otherRoom != null) {
if (newRoom.Intersect(otherRoom)) {
failed = true;
break;
}
}
}
if (!failed) {
rooms[curNumRooms] = newRoom;
curNumRooms++;
}
}
由于某种原因,失败总是评估为真。我投入了几个调试消息,奇怪的是,失败的评估两次 - 第一次,在foreach循环中,它正确评估。第二次,它评估为假。如果我初始化失败为true,那么它第二次计算为true,几乎就像while循环运行两次一样,并且第二次忽略foreach循环。
为什么会这样?
编辑1:这是我的Rectangle类和有关的变量:
public class Rectangle {
public int x1;
public int y1;
public int x2;
public int y2;
public bool Intersect(Rectangle other) {
return (x1 <= other.x2 && x2 >= other.x1 && y1 <= other.y2 && y2 <= other.y1);
}
public Rectangle(int x, int y, int w, int h) {
this.x1 = x;
this.x2 = x+w;
this.y1 = y;
this.y2 = y + h;
}
public Rectangle() {
}
public Vector2 Center() {
int centerX = (x1 + x2) / 2;
int centerY = (y1 + y2) / 2;
Vector2 center = new Vector2(centerX, centerY);
return center;
}
}
这是我使用的变量:
public Vector2 levelSize = new Vector2(80,30);
public int maximumRoomSize = 10;
public int minimumRoomSize = 5;
答案 0 :(得分:3)
你的数学错了。这样:
public bool Intersect(Rectangle other) {
return (x1 <= other.x2 && x2 >= other.x1 && y1 <= other.y2 && y2 <= other.y1);
}
应更改为(注意我在语句的后半部分将<=
更改为>=
):
public bool Intersect(Rectangle other) {
return (x1 <= other.x2 && x2 >= other.x1 && y1 <= other.y2 && y2 >= other.y1);
}
答案 1 :(得分:2)
我不是肯定的,但你使用Rectangle.Intersect可能不对。 Intersect返回一个矩形,表示两个指定矩形的交集,如果没有交叉,则返回“空”矩形。你可以试试IntersectsWith - 这会返回一个布尔值。
答案 2 :(得分:0)
您的循环逻辑似乎没有任何错误,可能会错误地设置failed
。如果您确信该方法不应该在第二个循环中失败,请检查您的帮助方法,尤其是Rectangle.Intersect
。添加更多跟踪输出对于调试也很有用。
答案 3 :(得分:0)
在while循环的每次迭代中,失败被重新初始化为false
答案 4 :(得分:0)
我对评估两次感到困惑?当然在休息之后它会退出for循环。也许尝试清理你的解决方案,删除隐藏的obj目录,然后重建?
答案 5 :(得分:0)
如果不了解Intersect方法,我会说它必须是造成问题的原因。你说while循环的第一次迭代(猜测我的部分 - 你的问题部分含糊不清)给出了对失败的正确评价(我猜这是在if (!failed)
行)。这里不调用Intersect方法,因为rooms数组中没有空间,因此失败变量的初始化失败是错误的。然后第二次通过while循环在房间数组中有一个房间,Intersect方法根据您的目的不正确地评估,并且总是说有一个交叉点。我现在可以看到@FreeAsInBeer在Intersect方法中看到了一个错误。