16x16 のタイルを持つタイル エンジンに基づいて、XNA を使用して C# でランダム シティ ジェネレーターを作成しています。グリッド パターンで道路を生成し、それらをList<T>
ピクセル単位の位置とタイル座標で配置しました。そこで、道路が使用しているタイルを「Occupied = true」に設定し、残りの未使用のタイルを建物で埋めようとしました。
しかし、難しいのは、建物のテクスチャを 1 つのタイルよりも大きくしたいということです。私のタイルは別の場所に整理され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++;
}