今天早些时候,我问了一个关于如何按顺序放置图像作为整个图片的一部分的问题,这样我就可以生成像旧的口袋妖怪游戏中看到的2D地图。一切都是以瓷砖为基础的。
我已经到了我自己生成地图的地步,但它有点滑稽。
当我用Tile Objects填充HashMap时,我已经跟踪了这个问题。 Tile对象包含Name和BufferedImage。似乎问题是程序如何从填充了tile(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)....
注意如果在1.png之后它开始计数10,然后是100,然后是101,然后是102 ...然后当它达到112时,它开始计数如下:
(112,2.png)(113,20.png)(114,200.png)(115,201.png)...
此文件夹中共有220个Tiles,(计算tile 0.png)。 我清楚地看到问题是什么,但不是我如何解决它。
答案 0 :(得分:1)
您可以将图像文件的名称更改为001.png,002.png等等(所有名称具有相同的长度,前导零)。这将让您按正确的顺序阅读文件。
答案 1 :(得分:1)
我猜测folder.listFiles()
不会按顺序返回文件。您可以将它们放入List
然后对其进行排序,但这不是一个好方法。如果图片50.png
被删除而某人添加了100000.png
,那么49之后的所有图片都会被移过一张。这可能很容易被发现。
更好的方法是将文件名拆分为句点并将其解析为int。
以下是拆分文件名的方法:
String filename = file.getName();
String[] parts = filename.split("\\.");
counter = Integer.parseInt(parts[0]);
使用这种方法,您不再需要递增计数器。如果图像丢失,它也不会对图块进行不正确的编号。