DXライブラリとC言語でゲーム制作日記4コード目。前回のシーン切り替え機能と同じぐらい重要であろう選択肢(選択項目)の実装をしてみる。
選択肢(選択項目)を実装したい
前回シーンの切り替えと同じぐらい必要になるのが選択肢(選択項目)の実装。ほとんどのゲームで起動後のタイトル画面で選択肢があることだろう。
2Dアクションゲームだと起動後のタイトル画面で
- はじめから
- つづきから(=データ選択)
- オプション
みたいな感じで並んでることが多いと思う。
シーン切り替えと同じくDXライブラリ側で選択肢を作る関数はないので(ちなみにUnity側にもないらしい)自前で作ってあげる必要がある。
実装例
前回と同じく細かい説明は後にしてまずはコードの例を。中身はメニュー(=タイトル画面)に選択肢を表示し、キー入力に合わせて他の画面(ゲーム画面、コンフィグ画面)に切り替えるもの。
前回のシーン切り替えの実装で追加したMenu.cppを以下の様にコードを変更・追加した。こちらもこのサイトのコードを参考。
#include "Menu.h" #include "SceneMgr.h" #include "DxLib.h" #include "Key.h" const static int GAME_Y = 240; //「ゲーム」文字のy位置 const static int CONFIG_Y = 270; //「設定」文字のy位置 typedef enum { eMenu_Game, //ゲーム eMenu_Config, //設定 eMenu_Num, //本項目の数 } eMenu; static int NowSelect = eMenu_Game; //現在の選択状態(初期はゲーム選択中) //初期化 void Menu_Initialize() { } //更新 void Menu_Update() { if (Keyboard_Get(KEY_INPUT_DOWN) == 1) {//下キーが押されていたら NowSelect = (NowSelect + 1) % eMenu_Num;//選択状態を一つ下げる } if (Keyboard_Get(KEY_INPUT_UP) == 1) {//上キーが押されていたら NowSelect = (NowSelect + (eMenu_Num - 1)) % eMenu_Num;//選択状態を一つ上げる } if (Keyboard_Get(KEY_INPUT_RETURN) == 1) {//エンターキーが押されたら switch (NowSelect) {//現在選択中の状態によって処理を分岐 case eMenu_Game://ゲーム選択中なら SceneMgr_ChangeScene(eScene_Game);//シーンをゲーム画面に変更 break; case eMenu_Config://設定選択中なら SceneMgr_ChangeScene(eScene_Config);//シーンを設定画面に変更 break; default: break; } } } //描画 void Menu_Draw() { int y = 0; DrawString(200, 150, "メニュー画面です。", GetColor(255, 255, 255)); DrawString(200, 170, "上下キーを押し、エンターを押して下さい。", GetColor(255, 255, 255)); DrawString(280, GAME_Y, "ゲーム", GetColor(255, 255, 255)); DrawString(280, CONFIG_Y, "設定", GetColor(255, 255, 255)); switch (NowSelect) {//現在の選択状態に従って処理を分岐 case eMenu_Game://ゲーム選択中なら y = GAME_Y; //ゲームの座標を格納 break; case eMenu_Config://設定選択中なら y = CONFIG_Y; //設定の座標を格納 break; } DrawString(250, y, "■", GetColor(255, 255, 255)); } //終了処理 void Menu_Finalize() { }
前回と同じように選択肢を保存する変数NowSelectを用意。キー入力に合わせて選択肢を変更したり、シーンの切り替えの処理と合わせたりする。選択肢を増やしたい場合は構造体eNumの中にeMenu_***を追加し、それに合わせてNowSelect絡みのswitch文にも処理を追加する。選択肢の位置とかは手動で調整してがんばる。
注意してほしいのはキー入力を得る関数Keyboard_Get()の部分。if文の中にある ==1 の部分を >0 とかにするとすさまじい勢いで選択肢が変わり大変なことになるので注意。
コメント