我正在使用 XNA 在 C# 中制作一个随机城市生成器,该生成器基于具有 16x16 瓷砖的瓷砖引擎。我已经以网格模式生成了道路,并将它们放置List<T>
在像素位置以及平铺坐标中。所以我将道路使用的瓷砖设置为“Occupied = true”,并尝试用建筑物填充任何剩余的未使用瓷砖。
然而,困难在于我希望建筑纹理大于只有一块瓷砖。我的瓷砖被组织在另一个地方List<T>
并且有一个被占用的财产,所以我可以检查天气它是否被填满。所以我需要检查 32x32 矩形中 4 个瓷砖的属性,以查看它们被占用的天气,如果没有在那里放置建筑物。
我已经实现了这一点,但是它非常缓慢且效率低下,因为它循环遍历每个图块并每次循环检查整个列表 4 次。所以我正在寻找一种更好的方法来做到这一点。我也知道我的整个系统可能有点愚蠢,但我是新手,正在尝试使用我有限的知识来实现这一点。
foreach (Tile Tile in Tiles) {
Tile Tile1 = Tiles.Find(delegate(Tile T1) { return T1.TileCoords() ==
new Vector2(X, Y) && T1.Occupied == false; });
Tile Tile2 = Tiles.Find(delegate(Tile T1) { return T1.TileCoords() ==
new Vector2(X + 1, Y) && T1.Occupied == false; });
Tile Tile3 = Tiles.Find(delegate(Tile T1) { return T1.TileCoords() ==
new Vector2(X, Y + 1) && T1.Occupied == false; });
Tile Tile4 = Tiles.Find(delegate(Tile T1) { return T1.TileCoords() ==
new Vector2(X + 1, Y + 1) && T1.Occupied == false; });
if (Tile1 != null && Tile2 != null && Tile3 != null && Tile4 != null) {
MyBuildings.Add(new Buildings(new Rectangle(Tile1.Rectangle.X,
Tile1.Rectangle.Y, Engine.TileWidth * 2, Engine.TileHeight * 2)));
Tile1.Occupied = true;
Tile1.OccupiedWith = "Building";
Tile2.Occupied = true;
Tile2.OccupiedWith = "Building";
Tile3.Occupied = true;
Tile3.OccupiedWith = "Building";
Tile4.Occupied = true;
Tile4.OccupiedWith = "Building";
}
if (X > WorldSize.X / 16) {
X = 0;
Y++;
} else
X++;
}