質問

私はAndroidゲームに取り組んでいます。私は同じ問題に直面していました ここ

私は待機を試して、そこに示すようにすべてのソリューションに通知しましたが、アプリが再開するとすぐにnullポインター例外が得られます。これがログキャット情報です。

INFO/System.out(8166): on resume
INFO/System.out(8166): !!!! IN THE GAME RESUME ---- >>> 
INFO/System.out(8166):  SURFACE CREATED
INFO/System.out(8166): thread on resume
INFO/System.out(8166): in thread game pause=true
WARN/dalvikvm(8166): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
ERROR/AndroidRuntime(8166): FATAL EXCEPTION: Thread-11
ERROR/AndroidRuntime(8166): java.lang.NullPointerException
ERROR/AndroidRuntime(8166):     at com.org.GummyBlast.GameView.onDraw(GameView.java:442)
ERROR/AndroidRuntime(8166):     at com.org.GummyBlast.GameLoopThread.run(GameLoopThread.java:88)

surfacecreatedおよびsurfacedestroyed内のコード

private void init() {

    gameLoopThread = new GameLoopThread(this);
    holder = getHolder();
    holder.addCallback(new SurfaceHolder.Callback() {

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            System.out.println(" SURFACE DESTROYED");

            nullImages();
            boolean retry = true;

            //gameLoopThread.setRunning(false);
            if(!mGameIsRunning){
            while (retry) {
                try {
                    gameLoopThread.join();

                    retry = false;
                } catch (InterruptedException e) {
                }
            }
        }


    }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            System.out.println(" SURFACE CREATED");
            Log.d("surface create", "SURFACE CREATED");

            /*gameLoopThread.setRunning(true);

            gameLoopThread.start();*/
            start(holder);

        }

        public void start(SurfaceHolder holder) {
            if (!mGameIsRunning) {

                gameLoopThread.setRunning(true);
                gameLoopThread.start();
                mGameIsRunning = true;
            } else {

                gameLoopThread.onResume();
            }
        }

GamethReadクラスのコード

public class GameLoopThread extends Thread {
static final long FPS = 10;
private  GameView view;
public static boolean running = false;
public static boolean run = true;
public static boolean game_pause=true;
 private static Object mPauseLock;
 private boolean mFinished=false;
 long ticksPS = 1000 / FPS;
    long startTime;
    long sleepTime;
 SurfaceHolder holder;
public GameLoopThread(GameView view) {
     mPauseLock = new Object();

    this.view = view;
}

public GameLoopThread() {
     mPauseLock = new Object();
}


public void setRunning(boolean run) {
    running = run;
}




@Override
public void run() {
    while (running) {
        // Do stuff.
        System.out.println("in thread game pause="+Boolean.toString(game_pause));
        if (game_pause == true) {
            Canvas c = null;
            startTime = System.currentTimeMillis();
            try {
                c = view.getHolder().lockCanvas();
                synchronized (view.getHolder()) {
                    view.onDraw(c);

                }

            } finally {
                if (c != null) {
                    view.getHolder().unlockCanvasAndPost(c);
                }
            }

            sleepTime = ticksPS - (System.currentTimeMillis() - startTime);
            try {
                if (sleepTime > 0)
                    sleep(sleepTime);
                else
                    sleep(10);
            } catch (Exception e) {
                System.out.println("Error in game loop thread "+ e.getMessage());

            }
        }
        else{
        synchronized (mPauseLock) {
            while (game_pause==false) {
                try {
                    mPauseLock.wait();
                } catch (InterruptedException e) {
                }
            }
        }
        } 
    }
}
public void onPause() {
    synchronized (mPauseLock) {
        game_pause = false;
        System.out.println("thread on pause");
    }
}

/**
 * Call this on resume.
 */
public void onResume() {
    synchronized (mPauseLock) {
        game_pause = true;
        mPauseLock.notifyAll();
        System.out.println("thread on resume");
    }
}

}

アクティビティクラスのOnPause

@Override
public void onPause() {
    super.onPause();

    System.out.println(" --- IN GAME PAUSE ---");


        gameLoopThread = new GameLoopThread();
        gameLoopThread.onPause();

      }

Onresumeでゲームの状態を維持する方法は?ありがとう

役に立ちましたか?

解決

たぶんあなたは電話する必要があります onResume() あなたのスーパークラスで:

public void onResume() {
     super.onResume();
}

これがあなたに役立つことを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top