0

今天早些时候,我问了一个问题,关于如何将图像按顺序放置为整张图片的一部分,这样我就可以生成像你在旧口袋妖怪游戏中看到的 2D 地图。一切都是基于瓷砖的。

我已经到了我自己生成地图的地步,但结果有点好笑。

当我用 Tile Objects 填充 HashMap 时,我已经跟踪到了这个问题。一个 Tile 对象包含一个 Name 和一个 BufferedImage。问题似乎是程序如何从填充有瓷砖(png文件)的文件夹中读取文件并将它们放置在HashMap中。

这是我将 Tile 对象放入 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 个 Tiles,(计算 tile 0.png)。我清楚地看到问题是什么,但不是我如何解决它。

4

2 回答 2

1

您可以将图像文件的名称更改为 001.png、002.png 等(所有名称的长度相同,前导零)。这将使您以正确的顺序读取文件。

于 2012-10-13T21:27:49.640 回答
1

我猜这folder.listFiles()不会按顺序返回文件。您可以将它们放入 aList然后对其进行排序,但这不是一个好方法。如果图像50.png被删除并且有人添加了100000.png,那么 49 之后的所有图像都将移动一个。这很容易被发现。

更好的方法是按句点拆分文件名并将其解析为 int。

以下是如何拆分文件名:

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

使用这种方法,您不再需要增加计数器。如果图像丢失,它也不会错误地为图块编号。

于 2012-10-13T21:30:00.340 回答