私はもともと、タイルの2次元配列を使用して、さまざまな内容の手続き生成マップを格納していました。手続きマップの生成 - 隣接するタイルを決定
各タイルには隣接するリストが含まれているため、どのタイルが最も近いかを各タイルが知ることができ、8つの異なる辺(直線に隣接し、斜めに隣接している)に触れます。
一般的なアイデアは、Amitのポリゴンマップ生成から取得しましたが、私はボロノイの代わりにグリッド設定を使用して単純化しようとしましたが、私は当初考えるよりも多くのトラブルに遭遇しました。私の現在の苦境は、2次元アレイを廃止したときに隣接関係を理解することです。
これは私がリストに変更する前に、それをしていた方法である。
private void ConstructAdjacencyList() {
// Create Adjacency List
for (int x = 0; x < mapWidth; x++) {
for (int y = 0; y < mapHeight; y++) {
// Bool to find position of point
bool omitLeft = false; bool omitRight = false;
bool omitTop = false; bool omitBottom = false;
// Enable bools based on position, reset on each loop
if (x == 0)
omitLeft = true;
else if (x == mapWidth - 1)
omitRight = true;
if (y == 0)
omitTop = true;
else if (y == mapHeight - 1)
omitBottom = true;
// Add entries to list based on bool settings
if (!omitLeft) {
// Left center
islandMap[x,y].adjacent.Add(islandMap[x-1,y]);
if (!omitTop)
islandMap[x,y].adjacent.Add(islandMap[x-1,y-1]);
if (!omitBottom)
islandMap[x,y].adjacent.Add(islandMap[x-1,y+1]);
}
if (!omitTop) // Top Center
islandMap[x,y].adjacent.Add(islandMap[x,y-1]);
if (!omitBottom) // Bottom Center
islandMap[x,y].adjacent.Add(islandMap[x,y+1]);
if (!omitRight) {
// Right Center
islandMap[x,y].adjacent.Add(islandMap[x+1,y]);
if (!omitTop)
islandMap[x,y].adjacent.Add(islandMap[x+1,y-1]);
if (!omitBottom)
islandMap[x,y].adjacent.Add(islandMap[x+1,y+1]);
}
}
} // End Adjacency
Debug.Log ("Adjacencies Built");
}
のx、yの値は、現在(islandMap.pointに次のように生成されたxとyの値を格納するベクトル2Dを保持しています。 )
public MapController() {
width = height = (int)Mathf.Sqrt (tileCount);
// Lists for points
var points = new List<Vector2>();
// Build a random set of points.
for (float x = 0; x < width; x++) {
for (float y = 0; y < height; y++) {
points.Add(new Vector2(x,y));
}
}
map = new Map (points, width, height, lakeTreshold);
}
、マップ自体は現在、次があります。他の方法Sとともに
public class Map {
Func<Vector2, bool> inside; // Contains function to randomly seed area
bool needsMoreRandomness;
public List<Tile> islandMap; // Previously was Tile[,] islandMap
public int mapWidth { get; private set; } // Calculated as Sqrt(totalPoints)
public int mapHeight { get; private set; }
私は現在固執しているConstructAdjacencyList()メソッドとしてuch。
それでは、配列の位置付けに頼らずに、周辺ポイントの隣接リストを構築するにはどうすればよいですか?私は一時的にアレイからリスト全体を参照できますか?この2次元配列のリスト全体の各タイルへの参照を配置し、隣接関係を設定して情報を失うことなく配列を削除しますか?私はそれが唯一の参照を使用すると考えているので、それは問題ないはず...各タイルは、それがそうのように構築されたときの順序を保存するためのインデックスが含まれています
これが長すぎる場合foreach (var point in points) {
var p = new Tile { index = islandMap.Count, point = point };
p.border = point.x == 0 || point.x == mapWidth || point.y == 0 || point.y == mapHeight;
islandMap.Add (p);
tileLookup[point] = p;
}
申し訳ありません... Iちょうどそれがかなり大規模であることが分かりました.-
がこれに対処するいくつかの方法がありますが、あなたのタイルマップのサイズが指示することができますどのソリューションがより適切です - あなたはどのくらい多くのタイルを扱っていますか? – Pikalek
こんにちはPikalek、返信いただきありがとうございます。私は、現在最大300ポイントを入力することを検討していますが、現在は300ポイントを下回っています。計算時間では、それがうまくいくならば、正直なところ、それほど大きな取引ではありません。 – Ben
また、私は次のようにしようとしていました: 'Tile [、] tempArray = new Tile [mapWidth、mapHeight]; \t \t int count = 0;用{ \t \t \t(X ++; X
Ben