2012-07-27 5 views
1

다음 구조로 간단한 게임을 씁니다. 주요 XML 레이아웃 사용자보기 있음 :간단한 게임 버그

이보기에는 두 개의 파일이 있습니다.

package com.sokolovlev.UFOtest03; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class MenuView extends SurfaceView implements SurfaceHolder.Callback 
{ 
    private SurfaceHolder mSurfaceHolder; //Draw surface 

    public static MenuManager mMenuManager; //Draw manager 

    public MenuView(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 

     // Surface events registration 
     mSurfaceHolder = getHolder(); 
     mSurfaceHolder.addCallback(this); 

     mMenuManager = new MenuManager(mSurfaceHolder, context); 
    } 

    @Override 

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
    { 
     mMenuManager.initPositions(height, width); 
    } 

    @SuppressWarnings("static-access") 
    @Override 
    public void surfaceCreated(SurfaceHolder holder) 
    { 
    mMenuManager.setRunning(true); 
     try 
     { 
      mMenuManager.start(); 
     } 
     catch (Exception e) { } 
    } 

    @SuppressWarnings("static-access") 
    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) 
    { 
     boolean retry = true; 
     mMenuManager.setRunning(false); 
     while (retry) 
     { 
      try 
      { 
       mMenuManager.join(); 
     retry = false; 
      } 
      catch (InterruptedException e) { } 
     } 
    } 
} 

그리고 두 번째 파일이 무승부 관리자입니다 : 먼저 사용자 MenuView이다

package com.sokolovlev.UFOtest03; 

import ... 

public class MenuManager extends Thread 
{ 
    private SurfaceHolder mSurfaceHolder; 
    private static boolean mRunning; 

    private int _screenHeight; 
    private int _screenWidth; 

    private ... 

    Context c; 

    private ... 

    public MenuManager(SurfaceHolder surfaceHolder, Context context) 
    { 
     mSurfaceHolder = surfaceHolder; 
     mRunning = false; 
     c = context; 

     ... 
    } 

    public static void setRunning(boolean running) 
    { 
     mRunning = running; 
    } 
    @Override 
    public void run() 
    { 

     while (mRunning) 
     { 
      Canvas canvas = null; 
      try 
      { 
       // подготовка Canvas-а 
       canvas = mSurfaceHolder.lockCanvas(); 
       canvas.drawRGB(0, 0, 0); 

       synchronized (mSurfaceHolder) 
       { 
        //All drawing 
       } 
      } 
      catch (Exception e) { } 
      finally 
      { 
       if (canvas != null) 
       { 
        mSurfaceHolder.unlockCanvasAndPost(canvas); 
       } 
      } 
     } 
    } 
} 

모든 것이 잘 작동! (단계 №1)하지만 내가 중앙 단추를 누르거나 들어오는 전화가 있거나 작업 관리자 (단계 №2)를 호출하고 내 응용 프로그램으로 돌아갈 경우 - 내 그림이 아니라 검은 색 화면 만 (단계 №3) . 그러나 만약 내가 №2 단계 다음에 가서 내 애플 리케이션에, 나는 모든 것이 작동하는 것을 볼 수있다. enter image description here

내 도면에 영향을주는 리로딩이있는 곳을 모르겠다! 도와주세요!

+1

아마 http://stackoverflow.com/questions/3527621/how-to-pause-and-resume-a-surfaceview-thread에 대한 대답에 제안 된 내용을 시도해 볼 수 있습니다. – Michael

+0

아, LunarLander와 같은 표면 상태 만 저장할 수 있습니다. Tnx! – Leo

답변

0

이 문제를 해결하려면 설정을 저장하고 표면을 다시 시작해야합니다. 그런 다음 설정을로드하십시오. (LunarLander 예 참조)