3

我遇到了一个我似乎无法在这里解决的问题!我正在开发一个简单的 android 游戏并且几乎实现了所有东西,但后来决定添加一些障碍(游戏是月球着陆器风格的游戏)。

基本上,我创建了一个 Asteroid 类,只是想在屏幕上绘制它们。加载游戏时,小行星被绘制,一切正常,但如果你按下主页按钮或关闭电源然后重新启动游戏,我会得到一个 NPE:

03-04 21:33:21.243: E/AndroidRuntime(10748): FATAL EXCEPTION: Thread-680
03-04 21:33:21.243: E/AndroidRuntime(10748): java.lang.NullPointerException
03-04 21:33:21.243: E/AndroidRuntime(10748):    at com.swiss196.LunarLander.GameThread.doDraw(GameThread.java:421)
03-04 21:33:21.243: E/AndroidRuntime(10748):    at com.swiss196.LunarLander.GameThread.run(GameThread.java:386)

它指向以下代码:

canvas.drawBitmap(test2.getBitmap(), 120, 120, null);

这表明 getBitmap 返回的画布或 test2 对象/图像为空,但在此之前,我检查画布是否不为空。在位图中,我检查图像也不为空:

public Bitmap getBitmap() {
if(asteroidImage == null)
    asteroidImage = BitmapFactory.decodeResource(mGameView.getContext().getResources(),
                                                 R.drawable.asteroid);

return asteroidImage;
}

有什么想法吗?

4

2 回答 2

1

我忘记从包中重新加载一些需要的变量,包括图像..

感谢你的帮助!

于 2013-03-05T01:47:53.793 回答
0

您可能超出了内存预算,这就是您在尝试解码 Bitmap时得到空值的原因。

开发者网站有很好的描述如何避免这种情况。

使用的一个重要选项(再次查看第二个链接以了解如何使用它的示例)是“BitmapFactory.Options”,它允许您验证是否有足够的内存用于位图:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;

引用文档

解码时将 inJustDecodeBounds 属性设置为 true 可避免内存分配,为位图对象返回 null,但设置 outWidth、outHeight 和 outMimeType。此技术允许您在构建位图(和内存分配)之前读取图像数据的尺寸和类型。

于 2013-03-04T21:51:27.090 回答