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

今回は前回のシーン切り替え(画面遷移)機能と同じぐらい重要であろう選択項目の実装します。

選択項目を実装したい

ほとんどのゲームは起動するとまずタイトル画面が最初に出てくる(OPムービーは除く)が、そのタイトル画面には以下の項目が出ていると思う。

  • はじめから
  • 続きから
  • オプション
  • ゲームを終了する

RPGとかの場合、ゲーム本編でもメニュー画面を開くと「ステータス」「装備」「アイテム」「設定」といった項目が出てくるはず。

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

サンプルコード

前回のシーン切り替え機能で作ったメニュー画面から「コンフィグ画面」「ゲーム画面」へ切り替えるのを選択項目で実装してみる。

Menu.cpp

//以下の定数・変数を追加
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_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));
}

//略

const static~は#defineと同じ。#defineだと定数の型があいまいになりトラブルが起きることがあるため、型の指定ができるconst staticの方を使用している。

シーン切り替えの時と同じく選択項目を列挙体で指定。現在の選択項目を格納するNowSelectも用意。そしてキー入力に合わせて選択項目を変更し、エンターキーの入力があれば現在選択している項目の画面に移動するようにした。

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

コメント

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