【发布时间】:2014-07-25 17:30:42
【问题描述】:
我在 Windows 上遇到以下错误(但在 OSX 上没有):
Exception in thread "Engine" java.lang.IllegalArgumentException: Width (0) and height (0) cannot be <= 0
at java.awt.image.DirectColorModel.createCompatibleWritableRaster(Unknown Source)
at java.awt.image.BufferedImage.<init>(Unknown Source)
at sun.java2d.pipe.DrawImage.renderImageXform(Unknown Source)
at sun.java2d.d3d.D3DDrawImage.renderImageXform(Unknown Source)
at sun.java2d.pipe.DrawImage.transformImage(Unknown Source)
at sun.java2d.pipe.DrawImage.scaleImage(Unknown Source)
at sun.java2d.pipe.DrawImage.scaleImage(Unknown Source)
at sun.java2d.pipe.ValidatePipe.scaleImage(Unknown Source)
at sun.java2d.SunGraphics2D.drawImage(Unknown Source)
at sun.java2d.SunGraphics2D.drawImage(Unknown Source)
at simpleEngine.graphics.GameGraphics.drawGameObject(GameGraphics.java:27)
使用以下代码:
public void drawGameObject(GameObject obj, BufferedImage image) {
graphics2d.rotate(obj.getRotation(), obj.getX() + obj.getWidth()/2, obj.getY() + obj.getHeight()/2);
graphics2d.drawImage(image, (int) obj.getX(), (int) obj.getY(), (int) obj.getWidth(), (int) obj.getHeight(), null);
graphics2d.rotate(-obj.getRotation(), obj.getX() + obj.getWidth()/2, obj.getY() + obj.getHeight()/2);
}
GameObject 是在空间中表示的对象。它具有字段位置(双倍 x 和 y)、大小(双倍宽度和高度)和旋转(双倍弧度)以及上述字段的 getter 和 setter。
我不明白零高度和宽度的来源。在本例中,obj 的宽度和高度为 30,图像的宽度和高度为 535。
我们将不胜感激!
提前致谢!
编辑: 启动类时提供对 Graphics2D 对象的引用。此方法来自的类是 Graphics2D 的包装器,其方法简化了我的项目中的工作。当我检索 Graphics2D 时,我将它包装在这个类中并传递它。 (感谢 MadProgrammer 指出丢失的信息!)
我发现如果从 drawGameObject 中删除旋转代码,问题就解决了。它不会兑现,但不会旋转精灵。
我发现旋转是一个 NaN 并导致了问题。仍然不知道为什么它没有在 OS X 上抱怨..
【问题讨论】:
-
Graphics2D 的引用从何而来?
-
我编辑了问题来回答您的问题,因为我认为更多人可以使用该信息来回答问题。
-
如果您使用来自基于 JComponent 的 Componet 的 getGraphics,请不要使用。 To 不是绘画的方式。如果图形来自类似 BufferedStrategy 之类的东西,则应在每个绘制周期对其进行验证和更改
-
我确实从 BufferStrategy 中检索每个绘制周期的 Graphics2D。奇怪的是它在 OS X 上完美运行,但在 Windows 7 上崩溃。
-
如果没有可运行的示例来演示您的问题,就无法诊断您的问题