広告あり

【DXライブラリ】選択肢(選択項目)を実装する

DXライブラリとC言語でゲーム制作日記4コード目。前回のシーン切り替え機能と同じぐらい重要であろう選択肢(選択項目)の実装をしてみる。

選択肢(選択項目)を実装したい

前回シーンの切り替えと同じぐらい必要になるのが選択肢(選択項目)の実装。ほとんどのゲームで起動後のタイトル画面で選択肢があることだろう。

2Dアクションゲームだと起動後のタイトル画面で

  • はじめから
  • つづきから(=データ選択)
  • オプション

みたいな感じで並んでることが多いと思う。

シーン切り替えと同じくDXライブラリ側で選択肢を作る関数はないので(ちなみにUnity側にもないらしい)自前で作ってあげる必要がある。

スポンサーリンク

実装例

前回と同じく細かい説明は後にしてまずはコードの例を。中身はメニュー(=タイトル画面)に選択肢を表示し、キー入力に合わせて他の画面(ゲーム画面、コンフィグ画面)に切り替えるもの。

前回のシーン切り替えの実装で追加したMenu.cppを以下の様にコードを変更・追加した。こちらもこのサイトのコードを参考。

#include "Menu.h"
#include "SceneMgr.h"
#include "DxLib.h"
#include "Input.h"

const static int MENU_X = 32;
const static int MENU_Y = 32;

const static int GAME_X = 280;
const static int GAME_Y = 240;
const static int CONFIG_Y = 270;

typedef enum {
    eMenu_Game,         //ゲーム
    eMenu_Config,       //設定
    eMenu_Num,        //本項目の数
} eMenu;

static int NowSelect = eMenu_Game;    //現在の選択状態(初期はゲーム選択中)

//初期化
void Menu_Initialize() {

}

//更新
void Menu_Update() {
    if (Input_GetKeyboardDown(KEY_INPUT_DOWN)) {    //下キーが押されていたら
        NowSelect = (NowSelect + 1) % eMenu_Num;//選択状態を一つ下げる
    }
    if (Input_GetKeyboardDown(KEY_INPUT_UP)) {    //上キーが押されていたら
        NowSelect = (NowSelect + (eMenu_Num - 1)) % eMenu_Num;//選択状態を一つ上げる
    }

    if (Input_GetKeyboardDown(KEY_INPUT_RETURN)) {  //エンターキーが押されたら
        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 = GAME_Y;

    DrawString(MENU_X, MENU_Y, "メニュー画面です。", GetColor(255, 255, 255));
    DrawString(MENU_X, MENU_Y + 20, "上下キーを押し、エンターを押してください。", GetColor(255, 255, 255));

    DrawString(GAME_X, GAME_Y, "ゲーム", GetColor(255, 255, 255));
    DrawString(GAME_X, CONFIG_Y, "設定", GetColor(255, 255, 255));

    switch (NowSelect) {//現在の選択状態に従って処理を分岐
    case eMenu_Game://ゲーム選択中なら
        y = GAME_Y;    //ゲームの座標を格納
        break;
    case eMenu_Config://設定選択中なら
        y = CONFIG_Y;    //設定の座標を格納
        break;
    default:
        break;
    }

    DrawString(GAME_X - 30, y, "■", GetColor(255, 255, 255));
}

//終了処理
void Menu_Finalize() {

}

前回と同じように選択肢を保存する変数NowSelectを用意。キー入力に合わせて選択肢を変更したり、シーンの切り替えの処理と合わせたりする。選択肢を増やしたい場合は構造体eNumの中にeMenu_***を追加し、それに合わせてNowSelect絡みのswitch文にも処理を追加する。選択肢の位置とかは手動で調整してがんばる。

注意してほしいのはキーの入力を得る部分。ここの判定を単に任意のキーが押されているかどうかで処理するとすさまじい勢いで選択肢が変わって制御できなくなる。なので任意のキーが押された瞬間かどうかで判定すること。

コメント

タイトルとURLをコピーしました