У меня странная проблема с приведенным ниже кодом (я удалил несущественные части, и все указанные классы / функции работают должным образом):
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, он оценивает правильно.Второй раз он оценивается как ложный.Если я инициализирую fail как 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;