1

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++;
}
4

2 に答える 2

0

タイルを2次元配列に格納することを検討してください。これは、タイルベースのゲームで非常に一般的な(最も一般的ではないにしても)方法です。現在、特定のタイルを見つけるために配列全体をループする必要があるため、それらを配列に格納していますが、これはトラバースするには非常に非効率的です。2次元配列を使用すると、次の方法でタイルを検索できます。

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で除算または乗算することにより、タイルのピクセル位置(図面)と配列内の位置を簡単に変換できます。

于 2012-07-10T11:27:57.100 に答える
0

タイルの保管方法を変更することを提案します。

各タイルはList<Tile>、8x8構成で、隣接する タイルを持つことができます。ここに画像の説明を入力してください

そして、空きスペースを見つけようとしているときは、8つのネイバーを直線的に繰り返します。

この方法では、マップを作成するときにのみ、ネイバーを計算し、ネイバーリストに保存する必要があります。

この表現を使用すると、特定のパターンを使用してグリッドを移動するのも簡単になります(たとえば、川や道路などを作成する)。

于 2012-07-10T11:33:20.457 に答える