2013-07-28 2 views
0

Я написал игру, и я пытаюсь сделать ее лучше и избавиться от ошибок, и у меня есть как меню, так и состояние игры, опираясь на поток, но для меню I заблокирован чертеж, чтобы он рисовал каждый экран только один раз. Мой телефон перегревается в меню, поэтому я хотел создать поток только в игровом состоянии и сделать меню независимым от потока, например, перерисовывая прикосновение.Создание не-потокового меню - приложение SurfaceView для Android

Я знаю, как сделать все это, и это довольно просто, но я получаю странные ошибки, исключения с нулевым указателем для моих растровых изображений, которые работают безупречно, когда поток включен.

У меня есть функция OnDraw (Canvas с), где я все написано, что рисовать на каждом состоянии (например, меню или состояние игры)

В потоке она выглядит следующим образом (только рисунок часть)

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 методе @Override 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 является нулевым и бросает ошибку. И до того, как я просто изменил состояние заголовка, и он рисовал нормально (используя рисование нитей);

ответ

0

Иногда/часто, onSizeChanged называет несколько раз подряд, первый раз с шириной и высотой w = 0 и h = 0.

Самое лучшее, что нужно сделать, это

а) добавить проверку, чтобы увидеть, если ширина = 0, и если да ничего не делать (это будет назвать это снова с правильными размерами, вы также не нужно добавлять проверка на высоту = 0, поскольку либо w, либо h будут равны 0 или они будут> 0, и ваш вызов создания растрового изображения будет работать без ошибок)

b) переопределить onSurfaceChanged вашего поверхностного зрения вместо onSizeChanged и сделать затем производится пересчет/создание ваших растровых изображений.