2012-05-24 3 views
0
나는 또 다른 질문을 볼 수 같은 일부 코드를 사용하려고 해요

대답 : https://stackoverflow.com/a/621849/1044984래스터 형식의 예외 (자바)

이 사용되면 나는 다음과 같은 오류 얻을 : 여기

Exception in thread "AWT-EventQueue-0" java.awt.image.RasterFormatException: (y + height) is outside of Raster 
    at sun.awt.image.ByteInterleavedRaster.createWritableChild(Unknown Source) 
    at java.awt.image.BufferedImage.getSubimage(Unknown Source) 
    at main.Grid.paintComponent(Grid.java:111) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JLayeredPane.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paintToOffscreen(Unknown Source) 
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source) 
    at javax.swing.RepaintManager$PaintManager.paint(Unknown Source) 
    at javax.swing.RepaintManager.paint(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source) 
    at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source) 
    at sun.awt.SunGraphicsCallback.runComponents(Unknown Source) 
    at java.awt.Container.paint(Unknown Source) 
    at java.awt.Window.paint(Unknown Source) 
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) 
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) 
    at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source) 
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

코드입니다 이 오류와 관련된 :

try { 

      tileSheetBig = ImageIO.read(new File("sprites/tiles.png")); 
      charSheetBig = ImageIO.read(new File("sprites/player.png")); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     final int tileWidth = 64; 
     final int tileHeight = 64; 
     final int tileRows = 1; 
     final int tileCols = 11; 
     tileSheet = new BufferedImage[tileRows * tileCols]; 

     for (int i = 0; i < tileRows; i++) { 
      for (int j = 0; j < tileCols; j++) { 
       tileSheet[(i * tileCols) + j] = tileSheetBig.getSubimage(i 
         * tileWidth, j * tileHeight, tileWidth, tileHeight); 
      } 
     } 

     final int charWidth = 16; 
     final int charHeight = 23; 
     final int charRows = 2; 
     final int charCols = 3; 
     charSheet = new BufferedImage[charRows * charCols]; 

     for (int i = 0; i < charRows; i++) { 
      for (int j = 0; j < charCols; j++) { 
       charSheet[(i * charCols) + j] = charSheetBig.getSubimage(i 
         * charWidth, j * charHeight, charWidth, charHeight); 
      } 
     } 

답변에 제공된 코드와 별다른 차이가 없으므로 문제가 무엇인지 알 수 없습니다. Google에 오류를 시도했지만 거기에는 많은 답변이 나와 있지 않습니다.

답변

1

[X, Y, X + 폭, 높이 (Y) +]에 의해 지정된 영역이 때 RasterFormatExceptiongetSubImage() 의해 thrown 있다는 BufferedImage 지역 내에 포함되지 않는다.

tiles.png 이미지가 704x64 픽셀 (너비 * cols, 높이 * 행) 이상이고 player.png이 48x46 픽셀 이상인지 확인하십시오.

편집 : 죄송합니다. 언뜻보기에는 눈치 채지 못했습니다. player.png는 32x69 px 및 tiles.png이어야합니다. 64x704 px

EDIT 2 : 이렇게하면 스프라이트를 편집하지 않고 플레이어 코드가 수정됩니다. 타일에도 동일하게 적용하십시오.

final int charWidth = 64; 
final int charHeight = 64; 
final int charCols = 11; 
final int charRows = 1; 
for (int i = 0; i < charCols; i++) { 
    for (int j = 0; j < charRows; j++) { 
     charSheet[i * charRows + j] = charSheetBig 
      .getSubimage(i * charWidth, j * charHeight, charWidth, charHeight); 
    } 
} 
+0

tiles.png는 704x64 픽셀입니다. player.png의 크기는 48x46 픽셀입니다. – ComputerLocus

+0

내 편집을 참조하십시오. index * i *를 사용하여 0에서부터 * charRows *라는 변수로 확장하지만 실제로 x 축 스프라이트를 선택하는 데이 변수를 사용합니다 (열의 경우). * y * 색인에 대해서도 마찬가지입니다. tiles.png도 마찬가지입니다. –

+0

내 이미지가 가로가 아닌 세로가되어야하고 player.png의 크기가 다른 경우도 있습니다. – ComputerLocus