我写了一个游戏,我试图让它更好,摆脱错误,我有菜单和游戏状态本身依赖于一个线程,但对于菜单我锁定绘图,以便它绘制每个屏幕只有一次。我的手机在菜单上过热,所以我只想在游戏状态下创建线程,并使菜单独立于线程,例如重新绘制触摸。
我知道如何完成所有这些并且非常简单但是我得到了奇怪的错误,我的位图的空指针异常在线程打开时完美无缺。
我有一个onDraw(Canvas c)函数,我已经写了每个州的绘制内容(比如菜单或游戏状态)
在线程中它看起来像这样(只是绘图部分)
c = null;
c = holder.lockCanvas();
synchronized(holder){
onDraw(c);
}
holder.unlockCanvasAndPost(c);
现在我已经编写了一个简单的方法来调用以便在菜单中进行绘制
private void reDraw(){
menuCanvas = null;
menuCanvas = holder.lockCanvas();
synchronized(holder){
onDraw(menuCanvas);}
holder.unlockCanvasAndPost(menuCanvas);
}
在onSizeChanged方法中 @覆盖 protected void onSizeChanged(int w,int h,int oldw,int oldh){ screenW = w; screenH = h;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;
while (bmpBackground==null){
if (screenW>500){
bmploader = BitmapFactory.decodeResource(getResources(),R.drawable.bg_planet,options);
bmpBackground = Bitmap.createScaledBitmap(bmploader, screenW, screenW, true);
if (bmploader!=null){
bmploader.recycle();
bmploader = null;
}
}
else{
bmploader = BitmapFactory.decodeResource(getResources(),R.drawable.bg_planet_small,options);
bmpBackground = Bitmap.createScaledBitmap(bmploader, screenW, screenW, true);
if (bmploader!=null){
bmploader.recycle();
bmploader = null;
}
}
}
loadMusic();
loadBitmaps();
loadShip();
changeState(states.TITLE);
reDraw();
super.onSizeChanged(w, h, oldw, oldh);
}
它几乎告诉我bmpBackground是一个null并抛出一个bug。在我刚刚改为标题状态并正常绘制之前(使用线程绘图);
答案 0 :(得分:0)
有时/经常,onSizeChanged连续多次被调用,第一次宽度和高度为w = 0且h = 0。
最好的办法是
a)添加一个检查以查看width = 0,如果是,则不执行任何操作(它将使用适当的尺寸再次调用它;您也不需要添加高度= 0的检查,因为要么w和h将为0或者它们将> 0并且您对位图创建的调用将运行而没有错误)
b)覆盖surfaceview的onSurfaceChanged而不是onSizeChanged,然后重新计算/创建你的位图。