0

次の例のようなマップをループして、その幅と高さ、およびファイルの各ポイントの数を取得する必要があります。次に、その位置に (サイズを掛けた) 幅のパラメーターにタイルを追加します(x, y, width, height, id)。" id" は、テキスト ファイル内の現在の番号です。ファイルがどのように見えるかの例を次に示します。

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

マップ上のそれぞれの位置に新しいタイルを追加しようとしましたが、mapWidth と mapHeight はファイルの最初の位置 (この場合は 2) に実際のデータを返しています。配列にタイルを追加できるように、このテキスト ファイルのデータの幅と高さを返すにはどうすればよいですか? 私が試したコードは次のとおりです。

try {
    Tile[][] tiles;
    int mapWidth, mapHeight;
    int size = 64;
    //variables in same scop to save you time :)

    FileHandle file = Gdx.files.internal(s);

    BufferedReader br = new BufferedReader(file.reader());

    mapWidth = Integer.parseInt(br.readLine());
    mapHeight = Integer.parseInt(br.readLine());

    System.out.println(mapWidth);

    int[][] map = new int[mapWidth][mapHeight];
    tiles = new Tile[mapWidth][mapHeight];

    for(int i = 0; i < tiles.length; i++) {
        for(int j = 0; j < tiles[i].length; j++) {
            tiles[i][j] = new Tile(i * size, j * size, size, map[j][i]);
        }
    }

    br.close();         
} catch(Exception e) { e.printStackTrace(); }
4

1 に答える 1

0

ファイルの解析方法に問題があるようです。この問題の性質上、行ごとに解析する必要があり、その行内で項目ごとに解析できます。

データを解析する方法の一般的な例を次に示します (配列のサイズを処理する必要がないように、List と ArrayList を使用しています...物理配列を使用する場合は、全体を読み取ることができますファイルを最初にメモリに挿入するとList<String> lines = new ArrayList();、バッファリングされたリーダーがこれに挿入できList、それをループしてアイテムの各サブ配列を追加できます。

データ:

$ cat Tiles.dat
2 0 0 0 0 0 0 0 2
2 0 0 0 0 0 0 0 2
2 0 0 0 0 0 0 0 2
1 1 1 1 1 1 1 1 1 1

スクリプト (ファイルを解析する例):

$ cat Tiles.java 
import java.io.*;
import java.util.*;

class MainApp {
    public static void main(final String[] args) {
        final String fileName = "Tiles.dat";
        try {
            File file = new File(fileName);
            FileReader fileReader = new FileReader(file);
            BufferedReader br = new BufferedReader(fileReader);

            List<List<Integer>> map = new ArrayList<List<Integer>>();

            String line = null;
            while ((line = br.readLine()) != null) {
                String[] items = line.split(" ");
                ArrayList<Integer> intItems = new ArrayList<Integer>();
                for (String item : items) {
                    int intItem = Integer.parseInt(item);
                    intItems.add(intItem);
                }

                map.add(intItems);
            }
            br.close();

            System.out.println("map: '" + String.valueOf(map) + "'.");
            for (List<Integer> intItems : map) {
                System.out.println("intItems: '" + String.valueOf(intItems) + "'.");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

出力:

$ javac Tiles.java 
$ java MainApp 
map: '[[2, 0, 0, 0, 0, 0, 0, 0, 0, 2], [2, 0, 0, 0, 0, 0, 0, 0, 0, 2], [2, 0, 0, 0, 0, 0, 0, 0, 0, 2], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]'.
intItems: '[2, 0, 0, 0, 0, 0, 0, 0, 0, 2]'.
intItems: '[2, 0, 0, 0, 0, 0, 0, 0, 0, 2]'.
intItems: '[2, 0, 0, 0, 0, 0, 0, 0, 0, 2]'.
intItems: '[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]'.

それが役立つことを願っています!

于 2015-05-03T00:17:38.810 に答える