レベルが別々の.txtファイルに保存されるAndroidでゲームを作成しています。各レベルは、マップ上の異なるアイテムを表す文字のグリッドになりますが、各レベルはさまざまなサイズになるため、ファイルを読み取り、各レベルを 2d に格納する堅牢なコードを作成したいと考えています。そのサイズに関係なく、arraylist。
私の最初の試み:
private void loadLevel(String filename) {
mapWidth = 0;
mapHeight = 0;
BufferedReader br = null;
try {
String line = null;
br = new BufferedReader(new InputStreamReader(mContext.getAssets().open(filename)));
while ((line = br.readLine()) != null) {
mapArray.add(getLevelLine(line));
mapHeight++;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
private ArrayList<Character> getLevelLine(String line) {
ArrayList<Character> levelLine = new ArrayList<Character>();
if (line == null) return levelLine;
char[] lineArray = line.toCharArray();
for (char mapPiece : lineArray) {
levelLine.add(mapPiece);
}
mapWidth = lineArray.length;
return levelLine;
}
mapWidth は行ごとに再計算され、テキスト ファイルの最初の水平行が読み取られ、arraylist の最初の垂直列に格納されるため機能しないため、これは少し非効率的です。ただし、x 座標と y 座標は入れ替わっています。
試行 2:
private void loadLevel(String filename) {
mapWidth = 0;
mapHeight = 0;
BufferedReader br = null;
try {
String line = null;
br = new BufferedReader(new InputStreamReader(mContext.getAssets().open(filename)));
while ((line = br.readLine()) != null) {
mapArray.add(new ArrayList<Character>());
char lineArray[] = line.toCharArray();
for (char mapPiece : lineArray) {
mapArray.get(mapHeight).add(mapPiece);
}
mapHeight++;
mapWidth = lineArray.length;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
これは同じ方法で mapWidth を計算するので、まだ少し効率が悪いようです。空のエントリを arraylist に追加することで、それぞれの i 番目の要素をループ処理できるようになることが期待されていました。この 2 回目の試行でも、mapHeight が正しく増加しません。これは、最後の反復で mapHeight が増加し、while ループが再度実行されないためですが、while ループの後で mapHeight から 1 を減算しても、何らかの理由で、私は範囲外のインデックス エラーを取得します。さらに重要なことは、mapWidth と mapHeight を手動で設定することにより、2 回目の試行でも、配列リストに格納するときに x 座標と y 座標が入れ替わるように見えることです。
私が見逃している明らかなものはありますか?テキスト ファイルの事前読み取りを必要とせず、通常の char 配列の使用を避ける、比較的簡単な方法があるはずです。
助けてくれてありがとう!