createBitmapでつくったbitmapのmWidthが-1

242 views
Skip to first unread message

nakajima

unread,
Jun 7, 2014, 11:05:27 AM6/7/14
to android-g...@googlegroups.com
こんばんはnakajimaです
ゲームをつくりながらandroidを勉強しています。
ゲーム制作にあたってnullpointerexceptionが出たのですが、それがどういう原因なのかわからないので、質問させていただきます。
パズルゲームなのですが、AIを作って、これと対戦できるようにするつもりです。(イメージとしてはぷよぷよのような対戦画面)
そこで、ひとつのactivityに、二つのsurfaceViewを設置し、二つは独立のプレイヤー用とAI用のゲーム画面を映すようにしたいと考えております。
そこでまず,displayの半分の大きさのuser用のゲームsurfaceViewを画面に設置できるか試してみたのですが、デバッグしてみると、surfaceViewのダブルバッファリング用にcreateしたbitmapを参照している箇所でnullPointerExceptionが出ました。
createした直後のbitmapの中身を見てみると、
     mDensity=240,mHeight=-1,mWidth=-1,mNinePatchChunck=null
のようになっていました。このbitmap自体はnullではなかったのですがmHeightが-1になっているのが原因なのではないかと疑っています。
しかしcreateBitmapの引数の幅、高さには値を与えているし、一体何が原因なのかわからなくて困っています。
以下はmainAcitvityのoncreateメソッド内の実装です。
何かわかる方がいましたら知恵を貸してください。よろしくお願いします。

public class MainActivity extends Activity {
private User user;//userクラスのメンバとしてsurfaceViewを持っている
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        user=new User(300,700,this);//ここのコンストラクタの第一、第二引数をcreatebitmapの幅高さとしてコンストラクタ内でbitmapを作っています(値は今は適当です)
        setContentView(user.gameView);//userのゲームsurfaceViewを表示
        
    }
}

Makoto Yamazaki

unread,
Jun 7, 2014, 1:12:27 PM6/7/14
to android-g...@googlegroups.com
zaki です。

Bitmap の mWidth, mHeight は、getWidth(), getHeight() の一度目の呼び出しの際に
値が書き込まれるので、それまでは -1 になっているのは正常な挙動です。




--
このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには android-group-j...@googlegroups.com にメールを送信してください。
このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
YAMAZAKI Makoto

nakajima

unread,
Jun 7, 2014, 10:47:10 PM6/7/14
to android-g...@googlegroups.com
zakiさん回答ありがとうございます。
しかしmWidthが-1なのは正常なのに、なぜnullpointerexceptionが起こるのでしょうか。
createしたbitmapのgetWidth()やgetHeight()を使う必要が今のところないので、ずっと-1のままです。
createBitmapをしてからnullPointerExceptionが出た箇所までの処理の流れは、
初めに、あるクラスのコンストラクタで
userBoard=Bitmap.createBitmap(300, 700, Config.RGB_565);
でbitmapを作り、
別のクラスでこれをcanvasとして、このbitmapに描画処理を行い、
また別のクラス(surfaceView)で,displayに、描画処理を行ったbitmapを貼るという処理の流れです。
      Canvas canvas=getHolder().lockCanvas();
canvas.drawBitmap(offScreen,0,0,null);//←ここでnullPointerexceptionが出る。(offScreenはuserBoardのデータをコピーしています)
getHolder().unlockCanvasAndPost(canvas);

別のアプリを作った時はうまくダブルバッファリングができたのですが、今回はなぜかうまくいきません。
今回と前回作ったアプリとの違いはダブルバッファリング用のoffScreenビットマップを作って、描画して。diplayに貼るという処理をすべて同じ一つのクラス内で行っていたということです。
今回はこの3つの処理をクラスごとに分けていますが、それは今回のnullPointerには関係はないと思っています。
なにがいけないのか知恵を貸してください。よろしくお願いします。

2014年6月8日日曜日 2時12分27秒 UTC+9 zaki:
このグループから退会し、グループからのメールの配信を停止するには android-group-japan+unsub...@googlegroups.com にメールを送信してください。

このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
YAMAZAKI Makoto

さわださとし

unread,
Jun 7, 2014, 11:54:07 PM6/7/14
to android-g...@googlegroups.com
さわだです。

> zakiさん回答ありがとうございます。
> しかしmWidthが-1なのは正常なのに、なぜnullpointerexceptionが起こるのでしょうか。
> createしたbitmapのgetWidth()やgetHeight()を使う必要が今のところないので、ずっと-1のままです。
> createBitmapをしてからnullPointerExceptionが出た箇所までの処理の流れは、
> 初めに、あるクラスのコンストラクタで
> userBoard=Bitmap.createBitmap(300, 700, Config.RGB_565);
> でbitmapを作り、
> 別のクラスでこれをcanvasとして、このbitmapに描画処理を行い、
> また別のクラス(surfaceView)で,displayに、描画処理を行ったbitmapを貼るという処理の流れです。
>       Canvas canvas=getHolder().lockCanvas();
> canvas.drawBitmap(offScreen,0,0,null);//←ここでnullPointerexceptionが出る。(offScreenはuserBoardのデータをコピーしています)
> getHolder().unlockCanvasAndPost(canvas);

canvas が null になってませんか?

http://developer.android.com/reference/android/view/SurfaceHolder.html#lockCanvas()
If null is not returned, this function internally holds a lock until
the corresponding unlockCanvasAndPost(Canvas) call,
preventing SurfaceView from creating, destroying,
or modifying the surface while it is being drawn.

--
さわださとし
http://www.satoshis.com/

nakajima

unread,
Jun 8, 2014, 1:00:18 AM6/8/14
to android-g...@googlegroups.com
さわださん回答ありがとうございます。
createしたbitmapから生成したcanvasはnullではありませんでした。
最終的な目的は独立な二つのsurfaceViewを並べてactivityに表示できるようにすることです。なにが原因かわからないのはすごく嫌ですけど、もしダブルバッファリングの処理を別々のクラスで行っているのが関係しているなら、進歩はないですが、これ以上進まないのは嫌なので、クラス設計を前回成功したアプリ(ダブルバッファリングは成功しました)のクラス設計と同じに変えようと思います。
surfaceViewを二つ横に並べるのはlinearLayoutの各surfaceViewのWeightを1にして実現したいと思います。

2014年6月8日日曜日 12時54分07秒 UTC+9 Satoshi Sawada:
Reply all
Reply to author
Forward
0 new messages