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);
            }
        }

回答に記載されているコードからあまり変更されていないため、問題が何であるかわかりません。私はエラーをグーグルで検索しようとしましたが、私の問題に関連する答えはあまりありません。

4

1 に答える 1

1

[ x,y : x+width, y+height] で指定された領域が領域内に含まれていない場合にスローRasterFormatExceptionます。getSubImage()BufferedImage

tiles.png 画像が少なくとも 704x64 ピクセル (幅*列、高さ*行) であること、同様に、player.png が少なくとも 48x46 ピクセルであることを確認してください。

編集: 申し訳ありませんが、一見しただけでは気づきませんでした。player.png は 32x69 ピクセルで、 tiles.png は 64x704 ピクセルでなければなりません

編集 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);
    }
 }
于 2012-05-24T01:40:06.480 に答える