0

今日の初めに、古いポケモンゲームで見られるような2Dマップを生成できるように、画像を全体像の一部として順番に配置する方法について質問しました。すべてがタイルベースです。

マップ自体を生成するところまで来ましたが、少しおかしいです。

HashMapにタイルオブジェクトを入力するまでの問題を追跡しました。タイルオブジェクトは、名前とBufferedImageを保持します。問題のように思われるのは、プログラムがタイルで満たされたフォルダーからファイル(pngファイル)を読み取り、それらをHashMapに配置する方法です。

タイルオブジェクトをHashMapに配置するときのコードは次のとおりです。

private static HashMap<Integer, Tile> getTiles(String path) throws IOException {
    HashMap<Integer, Tile> temp = new HashMap<>();
    File folder = new File(path);
    Tile tile;
    int counter = 0;
    for(File file : folder.listFiles()) {
        if(file.isFile()) {
            try {
                if(file.getCanonicalPath().endsWith(".png")) {
                    tile = new Tile(file.getName(),ImageIO.read(file));
                    temp.put(counter, tile);
                    counter++;
                }
            } catch(IOException ioe) {
                System.out.println("Picture number " + counter + " could "
                        + "not be saved in the hashmap: \n"
                        + ioe.getMessage());
                continue;
            }
        }
    }
    return temp;
}

そして、HashMapでtoString()を実行したときの出力は次のとおりです。

Tiles: (0,0.png)(1,1.png)(2,10.png)(3,100.png)....

tile 1.pngの後、10、100、101、102の順にカウントを開始します。次に、112に達すると、次のようにカウントを開始します。

(112,2.png)(113,20.png)(114,200.png)(115,201.png)...

このフォルダには合計220個のタイルがあります(タイル0.pngを数えます)。問題が何であるかははっきりとわかりますが、どのように修正するかはわかりません。

4

2 に答える 2

1

画像ファイルの名前を001.png、002.pngなどに変更できます(すべての名前の長さが同じで、先行ゼロが付いています)。これにより、ファイルを正しい順序で読み取ることができます。

于 2012-10-13T21:27:49.640 に答える
1

私はそれfolder.listFiles()が順番にファイルを返さないと思います。これらをに入れてList並べ替えることもできますが、これは優れたアプローチではありません。画像50.pngが削除され、誰かが追加された場合100000.png、49以降のすべての画像が1つシフトされます。これは簡単に検出されなくなる可能性があります。

より良いアプローチは、ファイル名をピリオドで分割し、それをintに解析することです。

ファイル名を分割する方法は次のとおりです。

String filename = file.getName();
String[] parts = filename.split("\\.");
counter = Integer.parseInt(parts[0]);

このアプローチを使用すると、カウンターをインクリメントする必要がなくなります。また、画像が欠落している場合でも、タイルに不適切な番号が付けられることはありません。

于 2012-10-13T21:30:00.340 に答える