■ 新・ゲーム開発講座 |
■ へっぽこプログラミング入門♪ |
■第43夜:システムメニュー:EXIT システムメニューの最上位窓の動作が出来たところで、順次サブメニューをインプリメントして参りましょう。今回は、内容が簡単な「EXIT」です。なにしろ、終了するだけですし(^^)窓の描画部分は、第41夜〜42夜と同じ要領で作ることとします。ほとんどコピペ感覚ですね。ソースはこちらです。 ところで、少し気の効いたプログラマであれば、このような似た処理がいくつも連続する場合は共通部分を抜き出してちょっとしたウィンドウシステムをつくって…という流れにすると思います。しかし今回作っている簡易窓はいたってシンプルなものなので、そのままベタ書きしたほうがわかりやすいだろうと思い敢えてコピペ式のリストにしています(ちょっと慣れたプログラマならツッコミを入れたくなるだろうけどそのへんは覚悟の上 ^^;)。まあ本人が高度でスマートだと思っているほどには他人の評価は高くない…というのはプログラミングの世界に限らずその辺でもよくあることですし、コピペだって一つの文化?でしょう(…ちょっと強引:汗 ^^;) ■仕様 今回の EXIT は、単純に「終了するか」を YES/NO 式に選択するだけです。終了処理そのものは第37夜の最後のほうで Sys_exit() という処理関数(BGMを止めて PostQuitMessage してるだけですが ^^;)を作っているのでこれを呼ぶことにします。「終了するか」でNOが選択された場合は窓を閉じてカーソルブリンク状態に戻ります。BMPは以下のようなものを使用します。 |
|
■撃つ では窓を開く処理から始めましょう。メインメニューと同様に、窓構造体 _Menu_Win SysMenu_exit を宣言し、メンバ変数は名前が長くなって並べるとウザそうなので #define で短縮表記名を定義しておきます。 起動関数名は System_exit() とでもしておきましょう。内容は前回と同じで、再入防止&タイマー蹴りで入り口制限をし、窓の基本パラメータを設定します。窓を開く位置は マウスカーソル位置に準じることにします(マウスカーソルの座標取得については第31夜参照)。 次いで作業用画面に窓BMPを読み込み、Backサーフェイスの内容を退避してから窓BMPを表示します。さらに EXITタスクを回す為にフラグをセットして起動処理はおしまいです。 フラグは、Mode_stat.flag_system_menu
に SYSMENU_EXIT をセットします。 |
//===================================================== _Menu_Win SysMenu_exit; //EXITメニューの窓情報用 //名前が長いと面倒なので短縮表記を定義(EXIT窓用) int System_exit() //システムメニュー窓を開く
|
■Mainloop そのフラグで処理を振り分けるメインループ(main.cpp)は以下のようになります。 |
void Mainloop(void) {
|
■回す タスク部分(=回す)もコピペ式に記述しましょう。短縮表記の変数部分が違うくらいで、ほとんど前回と同じですね。マウス座標とボタン押下げ状態をチェックし、YESが選択されていたら窓を閉じて終了関数を呼び、NOが選択されていたら窓だけ閉じてカーソルブリンク状態に戻ります。 |
int System_exit_task() //システムメニューのタスク部分 {
|
■締める 上記 System_exit_task() から呼ばれるEXITタスクの終了処理(=締める)です。プログラムの終了ではなくウィンドウを閉じる処理なのでお間違えなく…(^^) |
void _System_exit_task_end() //タスクの終了処理部分を分離したもの {
|
さて、サンプルソースをコンパイルして動かしてみましょう。右クリックでシステムメニューを表示し、EXIT を選ぶと EXIT OK? のサブウィンドウが出現しますね。ここで NO をクリックするとウィンドウは消去されてカーソルブリンク状態に戻り、YESをクリックすると終了します。 |
↓ |