■ 新・ゲーム開発講座 |
■ へっぽこプログラミング入門♪ |
■第42夜:メニュー窓を開くA 今回は、前回に引き続きメニュー窓の基本部分です。ここではメニューの選択部分を追加します。ソースはこちらになります。 ■窓構造体の拡張 窓構造体 _Menu_Win に、選択支数と選択支の矩形領域を格納するメンバを追加します。選択支はシステムメニューとしては LOAD、SAVE、FPS、EXITの4つですが、LOAD / SAVE でサブウィンドウを開くときもう少し多くの使う予定なので、ここでは選択アイテムはMAX 10個で想定しておきます。短縮表記も選択支ぶんのRECTについて用意しておきます。 |
//名前が長いと面倒なので窓構造体のメンバを短縮表記(^^;)
|
■メニューの起動(撃つ) さて窓の開く座標ですが、マウスのXYに連動したほうが微妙にカッコ良さそうなので座標設定部を替えることにしました(軟弱 ^^;) 次に、起動処理を行う System_menu() にて、選択アイテム数と選択支のRECTの設定を追加します。RECTは、LOAD、SAVE、FPS、EXIT の各文字部分の範囲をグラフィックソフトで座標検出し設定しています(BMP左肩=(0,0)として数える)。その他は特に変更は不要です。 なお MK_RECT() はRECT型変数に left,top,right,bottom の各メンバを設定する関数(マクロでもよかったかな ^^;)で、BasicTips.cpp に記述してあります。VC++の統合環境で関数名にカーソルを合わせてF1を押すとHELPが出ますが、自作関数では当然HELPは出ませんので 「これは何の関数だろう?」 と思ったらツールバーから編集→ファイル→検索を選択してソースのどこかに記述がないか探してみてください。 |
int System_menu() //システムメニュー窓を開く {
} |
タスク処理がちょっと長くなりそうなので、「締める」部分の処理を _System_menu_task_end() として分離しました。内容は背景の書き戻しとフラグの解除で、内容的には前回のソースと一緒です。 |
void _System_menu_task_end() //タスクの終了処理部分を分離したもの
= 「締める」操作 {
|
「回す」部分は以下のように選択支のスキャン部分を追加します。マウス座標が選択支の矩形領域に入っていれば赤文字を表示し、そうでなければ黒文字を表示しています。判定に用いている _Check_mouse_in_Rect() という関数は第32夜 「選択支」 のソース Text_Com_03.cpp のものを流用しています。 選択支4つぶんの判定には int L_button_menu という変数を用い、スキャン結果によって switch 文でそれぞれの処理関数(→次のウィンドウを開く訳ですが)を振り分けます。ただし今回はダミーとしてメッセージボックスを出すだけです。 |
bool _Check_mouse_in_Rect( RECT rect
) {
} int System_menu_task() //システムメニューのタスク部分 {
|
実行してみると、マウスカーソルに合わせてメニューアイテムが反転表示し、左クリックで該当するメニュー毎のメッセージボックスが表示され、右クリックでメニュー表示がOFFになる様子が確認できると思います。 スキャンの部分は、選択支数を可変にしたりする場合は冗長性を廃してもう少し気の効いた書き方をしたほうが良いのかもしれませんが、今回は可読性を重視して敢えてベタ書きにしています。まあ、この程度の長さなら許されるかな…と♪(^^;) |
|