2011-01-02 12 views
1

シンプルな3Dゲームマップ(minecraft)の選択チャンクを変更するプログラムをコーディングしています。マップはtheoretically very largeになる可能性がありますので、マップ全体を読み込むことは問題になりません。私は各16x16サイズのチャンクを一度ロードして、それらを再度修正する必要がある場合は、そのチャンクをメモリに保存します。私はこれらの部分を(x、y)座標の方法でメモリに格納するためのデータ構造が必要ですが、必要に応じてこのデータ構造のサイズを変更することができ、特定のチャンクを見つけることができます。 私は自分の要求を満たすためにどのようなデータ構造を使うことができないのか分からない。私は誰かが何か提案をすることを望んでいる。私はC#でコーディングしています。xy座標系のサイズ変更可能なデータ型が必要

答えて

4

Coordinateに基づくインデクサーを持つトップレベルのMapデータ構造をお勧めします。次に、ミニマップのようなデータ構造をChunkに追加します。 Mapインデクサのアクセサで、座標を含むチャンクがロードされているかどうか、ロードされていない場合はチェックします。その後、インデクサChunkインデクサにMapインデクサを委任します。 Mapは、Dictionaryを使用して読み込まれたチャンクを追跡できます。最後に、戦略に基づいてチャンクをアンロードする必要があります。最も最近使用されたもの。

このインフラストラクチャを使用すると、Mapを仮想無限平面として使用できます。

は、ここであなたが始めるためにいくつかの(未テスト)擬似コードです:

public struct Coordinate : IEquatable<Coordinate> 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 

    public bool Equals(Coordinate other) 
    { 
     return X == other.X && Y == other.Y; 
    } 

    public override int GetHashCode() 
    { 
     return X^Y; 
    } 
} 

public class Data 
{ 
    // Map data goes here. 
} 

public class Chunk 
{ 
    public Coordinate Origin { get; set; } 
    public Data[,] Data { get; set; } 

    public Data this[Coordinate coord] 
    { 
     get { return Data[coord.X - Origin.X, coord.Y - Origin.Y]; } 
     set { Data[coord.X - Origin.X, coord.Y - Origin.Y] = value; } 
    } 
} 

public class Map 
{ 
    private Dictionary<Coordinate, Chunk> map = new Dictionary<Coordinate,Chunk>(); 

    public Data this[Coordinate coord] 
    { 
     get 
     { 
      Chunk chunk = LoadChunk(coord); 
      return chunk[coord]; 
     } 
     set 
     { 
      Chunk chunk = LoadChunk(coord); 
      chunk[coord] = value; 
     } 
    } 

    private Chunk LoadChunk(Coordinate coord) 
    { 
     Coordinate origin = GetChunkOrigin(coord); 
     if (map.ContainsKey(origin)) 
     { 
      return map[origin]; 
     } 
     CheckUnloadChunks(); 
     Chunk chunk = new Chunk { Origin = origin, Data = new Data[16, 16] }; 
     map.Add(origin, chunk); 
     return chunk; 
    } 

    private void CheckUnloadChunks() 
    { 
     // Unload old chunks. 
    } 

    private Coordinate GetChunkOrigin(Coordinate coord) 
    { 
     return new Coordinate { X = coord.X/16 * 16, Y = coord.Y/16 * 16 }; 
    } 
} 
関連する問題