質問

私は作業スレッド上のキャンバス描画を処理する小さなAndroidゲームに取り組んでいます。ゲームが終わった後、このスレッドは次のアクティビティを開始する必要がありますが、どういうわけかUIスレッドは新しい関数を開始することに

これは私のゲームのメインループです:

while(true)
    // Perform Ticks until the player makes a mistake
    c = _surfaceHolder.lockCanvas();
    if ((toDraw = rh.performTick()) == null) {
         lose();
         break;
     }
     _surfaceHolder.unlockCanvasAndPost(draw(toDraw,c));
}

この関数は performTick() ゲームロジックを処理して返します null ゲームが終了したとき。 draw()レンダリングを行います。両方の機能は完璧に動作します-問題は lose(), 、これは新しい活動を開始するよりも何もしません:

    protected void lose() {
        Handler handler = new Handler(Looper.getMainLooper());
        handler.post(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(_context, MainMenu.class);
                _context.startActivity(intent);
            }
        });
    }

ゲームが終了すると、新しいActiviy(MainMenu)は正常に開始されますが、タッチイベントには反応しません。LogCat出力はなく、例外も発生しません。さらに悪いことに, lose()メインループが開始される前に呼び出されたときに正常に動作します。

私は今何日もこれに取り組んできました。私は作業スレッドから直接活動を開始しようとしました(aを使用せずに Handlerlose())と時間のためにインターネットを検索-何も助けにはなりません。UIスレッドが何らかの形でブロックされているか、無限ループに巻き込まれているようですが、これを修正する方法がわかりません。

すべてがNexus4デバイスでデバッグされます。

Btw: MainMenu.onCreate() 別の方法で起動したときに正常に動作します。

助けてください, マー-オ-マー-オ

役に立ちましたか?

解決

IFステートメントがTRUEの場合はキャンバスのロックを解除しません。キャンバスがロックされたままにしながら休憩を取り除きます。

while(true)
    // Perform Ticks until the player makes a mistake
    c = _surfaceHolder.lockCanvas();
    if ((toDraw = rh.performTick()) == null) {
         lose();
         break;
     }

     // this line won't be executed whether the if statement above is true
     _surfaceHolder.unlockCanvasAndPost(draw(toDraw,c));
}
.

IFステートメントの中にも(Lose()の前後)を解除する必要があります。

他のヒント

代わりに While(true) あなたは持っていることができます While(myVar) ここで myVar ゲームが実行されている間はtrueであり、呼び出すときにfalseに設定されるブール値です lose() あなたの場合、あなたはする必要はありませんでしたが、描き続けました。

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