2012-10-13 160 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