C# XNA瓷砖引擎,放置比瓷砖大的纹理

C# XNA瓷砖引擎,放置比瓷砖大的纹理,c#,xna,C#,Xna,我正在用XNA制作一个C#中的随机城市生成器,它基于一个瓷砖为16x16的瓷砖引擎。我以网格模式生成了道路,并将它们放在列表中,位置以像素为单位,也以平铺坐标为单位。因此,我将道路使用的瓷砖设置为“已占用=真实”,并尝试用建筑物填充剩余的未使用瓷砖 然而,困难在于我希望建筑纹理比仅仅一块瓷砖更大。我的磁贴组织在另一个列表中,并且有一个已占用的属性,因此我可以检查它是否已填充。因此,我需要检查32x32矩形中4块瓷砖的属性,以查看它们是否被占用,如果没有,则在那里放置一座建筑 我已经做到了这一点,

我正在用XNA制作一个C#中的随机城市生成器,它基于一个瓷砖为16x16的瓷砖引擎。我以网格模式生成了道路,并将它们放在
列表中,位置以像素为单位,也以平铺坐标为单位。因此,我将道路使用的瓷砖设置为“已占用=真实”,并尝试用建筑物填充剩余的未使用瓷砖

然而,困难在于我希望建筑纹理比仅仅一块瓷砖更大。我的磁贴组织在另一个
列表中
,并且有一个已占用的属性,因此我可以检查它是否已填充。因此,我需要检查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++;
}

考虑将磁贴存储在二维阵列中。这是一种非常常见(如果不是最常见的话)的基于平铺的游戏实践。现在,您将它们存储在数组中,这对于遍历非常低效,因为您必须遍历整个数组才能找到某个磁贴。使用二维数组,可以通过以下方式搜索平铺:

Tile T1 = Tiles[T1.X, t1.Y];
Tile T2 = Tiles[T1.X + 1, t1.Y];
Tile T3 = Tiles[T1.X, t1.Y + 1];
Tile T4 = Tiles[T1.X + 1, t1.Y + 1]; 

由于平铺的标准尺寸为16像素,因此您可以通过将平铺的像素位置(图形)除以或乘以16,轻松地在平铺的像素位置和它们在阵列中的位置之间进行转换。我建议更改存储平铺的方式

在8x8配置中,每个磁贴可以有一个邻居的
列表

当你试图找到一个自由空间时,你只需在8个邻域中进行线性迭代

只有在创建地图时,才需要计算邻居,并将其存储在邻居列表中


使用这种表示法,您还可以更轻松地使用特定图案(例如创建河流、道路等)在网格中行进。

因此,问题是:如何最佳地找到32x32的正方形,在其中放置建筑(由4x16x16瓷砖组成)?是,谢谢,这是一个简单的表达ITAH的方法,这将使生活更轻松,所以我可以为我的Tile类创建一个2d数组?是的。您可以在此处了解它们:。您可以使用常规数组,但List类也可以用于此目的。