3

ここでは解決できない問題が発生しています。私は単純なAndroidゲームを開発していて、ほとんどすべてを実装していましたが、いくつかの障害を追加することにしました(ゲームは月着陸船スタイルのゲームです)。

基本的に、私は小惑星クラスを作成し、それらを画面に描画しようとしています。ゲームをロードすると、小惑星が描画され、すべてが正常に機能しますが、ホームボタンを押すか、電源をオフにしてからゲームを再起動すると、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オブジェクト/画像のいずれかがnullであることを示唆しますが、これの前に、キャンバスがnullではないことを確認します。また、ビットマップ内で、画像がnullではないことを確認します。

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

おそらくメモリバジェットを超えています。これが、ビットマップをデコードしようとしたときにnull値を取得する理由です。

開発者サイトには、これを回避する方法についてのかなり良い説明があります。

使用する重要なオプションの1つ(使用方法の例については、2番目のリンクをもう一度参照してください)は、「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 に答える