2016-09-23 304 views
0

我已經做了一小段代碼來spritesheets分成單獨的圖像...出界例外getSubimage()方法

private BufferedImage sheet, dirt, grass, rock, tree, water; 

    int width = 64, height = 64; 

     public void split() { 
      dirt = sheet.getSubimage(0,0,width,height); 
      grass = sheet.getSubimage(width,0,width*2,height); 
      rock = sheet.getSubimage(width*2,0,width*3,height); 
      tree = sheet.getSubimage(0,height,width,height*2); 
      water = sheet.getSubimage(width,height,width*2,height*2); 
     } 

現在,預計前兩個(泥土和草)順利。但是,問題出在岩石種植線上。出於某種原因,則丟棄一個異常...

「 異常在線程‘線程0’java.awt.image.RasterFormatException:(X +寬度)是柵格
以外在sun.awt.image。 ByteInterleavedRaster.createWritableChild(ByteInterleavedRaster.java:1245)

因此很明顯,這個問題是x的值是做‘出界’。但是x的值是(寬* 2),所以128pix,這是很好的圖像(192x128),我已附加作爲證明的界限。

我也改變了一點點的代碼來裁剪x值爲1的岩石,但我仍然得到的問題,相同的使用相同的尺寸爲anothe bufferedImage。

對不起,在這篇文章中有什麼不對,這是我第一次。

在此先感謝

The image

+0

所以128是在Java範圍0-128? – John3136

+0

我從來沒有這樣做過,但我認爲你無論在高度還是寬度方面都是正確的。順便說一句,文檔說,x和y是左上角,你有,但之後,我會認爲正常的寬度和高度在這裏是適當的。由於您在某個時間點開始工作,您不必補償寬度或高度,這是我認爲您出錯的地方。嘗試做,寬度和高度(不是x和y)只是'寬度,高度'和原因'草地'不會給你一個錯誤是因爲你有第三個選項'岩石'旁邊。 –

回答

1

回答過我的意見。

所以你是在正確的道路上,但不完全瞭解getSubimage()如何工作。

文檔說

參數:

X - 的左上角的Y座標 - 指定矩形區域

y的左上角的X座標指定矩形區域的寬度

w - 指定矩形區域的寬度

h - 指定矩形區域

你正確設置你xy價值觀的高度,但是你在設置你widthheight值是錯誤的。

由於您從(x,y)開始,因此您不需要像現在這樣按照原樣使用它們來補償widthheight

所以,你的代碼將

public void split() { 
      dirt = sheet.getSubimage(0,0,width,height); 
      grass = sheet.getSubimage(width,0,width,height); 
      rock = sheet.getSubimage(width*2,0,width,height); 
      tree = sheet.getSubimage(0,height,width,height); 
      water = sheet.getSubimage(width,height,width,height); 
     } 
+0

謝謝你!哇,我不能相信我錯過了這麼簡單的XD – Kakarot117