2012-10-13 110 views
0

今天早些时候,我问了一个关于如何将图像作为整个图像的一部分依次放置的问题,以便我可以生成2D图,就像您在旧的Pokemon游戏中看到的一样。一切都基于瓦片。图像没有正确生成

我已经到了我自己生成地图的地步,但它有点滑稽。

我已经跟踪到问题了,当我用瓦片对象填充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; 
} 

这里是输出,当我做一个toString()上的HashMap:

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个瓷砖,(计数瓷砖0.png)。 我清楚地看到了什么问题,但不是我如何解决它。

回答

1

我猜想folder.listFiles()不会按顺序返回文件。你可以把它们放到List然后排序,但这不是一个好方法。如果图像50.png被删除,并且某人添加了100000.png,则49之后的所有图像将被移动一个。这很容易被忽略。

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

这里是如何将文件名分割:

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

通过这种方法,你不必再增加计数器。如果图像丢失,它也不会错误地编号。

+0

嗯,也许在列表中排序它首先听起来像一个吸引人的想法......但我担心它会按listFiles()的方式排序,如果我在列表中使用sort()。 – OmniOwl

+0

@Vipar如果使用'Comparator',则可以通过使用来控制排序 – MadProgrammer

+0

它应该按照字典顺序(即现在的方式)排序它们,但是您可以定义自己的比较器,它将名称转换为int并比较值。尽管如此,如果您碰巧拥有非int名称的文件,那么定义这样一个比较器是不安全的。 – svz

1

您可以将图像文件的名称更改为001.png,002.png等等(所有名称的长度都与前导零相同)。这会让你按照正确的顺序阅读文件。

+0

这真的是唯一的解决方案吗? :/ – OmniOwl