2016-03-29 31 views
1

私は自分のゲームの世界の地形を格納するクラスを持っています。 gameworldはキューブで構成され、すべてのキューブには地形があります。情報は、かなり大きな3D配列の整数として保存されます。上限65535バイトを超えるコンストラクタ

私が今直面する問題は、私の「マップ」が大きすぎてクラス(または列挙型)に格納できないということです。私はクラスや列挙体の外には何も知らないので、これをどうしたらいいのか分かりません。

私はそこからファイルを作成してそれを読むべきですか?もしそうなら、どうしたらいいですか?

マップを複数のクラスまたは列挙型に分割し、実行時にそれらを再度マージする方法もありますが、その方法もわかりませんし、非常に悪い解決策のようです。

EDIT:これは、世界地図の一部である:

0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 
0 0 0 0 0 0 0 0 0 2 2 0 0 0 1 1 1 1 1 1 
0 0 0 0 0 0 0 0 0 2 2 0 0 0 1 1 1 1 1 1 
0 0 0 0 0 0 0 0 0 2 2 2 2 1 1 1 1 1 1 1 
0 0 0 0 1 0 0 0 0 2 2 2 2 1 1 1 1 1 1 1 
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 
0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 1 
0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 1 1 0 0 
0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 
0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 
0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 
0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 
0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 
0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 
0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 1 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 
0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 0 
0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 1 0 0 
0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 

は、これらのブロック40は、(そう38以上)があり、それぞれが特定のz座標で世界を表します。私も配列形式でこれを持っています。 これをファイルから読み取る方法について、いくつかの(サンプル)コードを提供できれば素晴らしいでしょう。

+0

私はことを示唆していますあなたは別のクラスでそれを分割せず、単にファイルに格納します。 – Maljam

+0

メモリマップアプローチを試し、必要に応じてセクション内のメモリを読み込みます。 – Jay

+3

配列がコードでリテラルとして定義されているのではなく、データをファイルに格納してディスクから読み取って配列に格納することができます。 – Jire

答えて

1

リソースに入れる方がはるかに優れています。ただ、このようなコードを使用して、それをロードし、あなたが質問で使用したのと同じ形式であり、あなたの世界地図を入れて、(例えばmap.txtという名前の)あなたのクラスの隣のテキストファイルを作成します。

public int[][][] loadMap() { 
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(getClass() 
      .getResourceAsStream("map.txt"), StandardCharsets.ISO_8859_1))) { 

     List<int[][]> result = new ArrayList<>(); 
     List<int[]> cur = new ArrayList<>(); 
     String line; 
     while((line = reader.readLine()) != null) { 
      line = line.trim(); 
      if(line.isEmpty() && !cur.isEmpty()) { 
       result.add(cur.toArray(new int[0][])); 
       cur.clear(); 
      } else { 
       String[] cells = line.split("\\s+"); 
       int[] row = new int[cells.length]; 
       for(int i=0; i<cells.length; i++) row[i] = Integer.parseInt(cells[i]); 
       cur.add(row); 
      } 
     } 
     if(!cur.isEmpty()) 
      result.add(cur.toArray(new int[0][])); 
     return result.toArray(new int[0][][]); 
    } catch (IOException e) { 
     throw new UncheckedIOException(e); 
    } 
} 
+0

ありがとう、これは私が必要なものです。 – Sander

0

あなたはエラーを表示できますか?

あなたはチャンクしてマップを分割し、このように、例えばXMLでは、すべてのマップを保存することができますロードされ、すべてのマップを必要とするドント場合:

<map> 
    <chunk x=0 y=0> 
     <!--chunk informations> 
    </chunk> 
    <chunk x=0 y=1> 
     <!--chunk informations> 
    </chunk> 
    <!--other chunks> 
</map> 
+0

私は世界を初期化するすべてのものが必要です。そして、世界中に一度にアクセスできるようにするほうがはるかに簡単です。しかし、まだ:私は別のファイルから情報をロードする方法を知らない – Sander

+1

これはコメントではありません答えです。 – bhspencer

+0

また、https://docs.oracle.com/javase/7/docs/api/java/nio/MappedByteBuffer.html – Jay

1

それはあなたの中で可能な場合代わりにbyte[]のブロックを使用できます。さらにはshort[]を使用することもできます。次に、あなたはバイトの上限である65535の範囲内にあるはずです。

size för byte[] : 20 x 20 x 40 x 1 = 16000 bytes 
size för short[]: 20 x 20 x 40 x 2 = 32000 bytes 
+0

これは私の小さい地図の解決策かもしれませんが、80x80x80 = 512 000まで上がりますので、大きな地図ではまだ問題になります。 – Sander

関連する問題