BREW ブロック崩しゲーム 〜 BREW C++ ゲームプログラミング 〜
サスペンドとレジューム
サスペンド
BREW はシングル スレッド環境であるため、処理を他のアプリケーションに切り替える際にBREW は実行中のアプリケーションを休止 (サスペンド) させます。
サスペンド中もタイマー イベントは処理されるので、サスペンドさせられる前にタイマーを解除しておく必要があります。(これを怠ると、サスペンドから復帰したときにゲーム オーバーになっていて、悲しい思いをします。)
サスペンドさせられる前にやらなければならない処理は、OnAppSuspend に書いておきましょう。
このブロック崩しでは、
// アプリ中断ハンドラ Void Block::OnAppSuspend(AEESuspendReason reason, AEESuspendInfoPtr info){... // ここにアプリ中断時の処理を記述します。 if (_status == APP_STATUS_PLAYING) {SFBShellSmp shell = SFBShell::GetInstance();shell-> CancelTimer(CBAnimate, (VoidPtr)this);if (_blockMotion) {shell->CancelTimer(CBMoveBlocks, this);}}return;}
として、アニメーション用のタイマーとブロック移動用のタイマーの両方を解除しています。
レジューム
サスペンドから復帰 (レジューム) して処理が再開される前にやらなければならない処理があるときには、それらを OnAppResume に書いておきましょう。
このゲームではサスペンド時にタイマーを解除しているので、それらを再び有効にしなければなりません。
しかも BREW も SophiaFramework UNIVERSE も、レジュームするときにグラフィックスを再描画してくれません。自分で描いたグラフィックスは責任をもって再描画するようにしましょう。
このブロック崩しではこんな感じになります。
// アプリ再開ハンドラ Void Block::OnAppResume(AEEAppStartPtr environment) { ... // ここにアプリ再開時の処理を記述します。 switch (_status) { case APP_STATUS_PLAYING: DrawBlock(); if (_blockMotion) { SFBShellSmp shell = SFBShell::GetInstance(); shell->SetTimer(BLOCK_MOVEMENT_INTERVAL, CBMoveBlocks, this); } Animate(); break; case APP_STATUS_READY: CreateStage(_nowStage); break; case APP_STATUS_WAIT_RESTART: Initialize(); break; default: break; } return; }
実装の細かなことは省略しましたが、これでブロック崩しが完成しました。より高度なアプリケーションの作り方については、他のチュートリアルをご覧ください。