動的に変化するメニューって何?って思うだろう。
SRPGでは自軍ユニットの射程範囲に敵が来ると「戦う」コマンドメニューが表示されるし
道具屋に入れるマスに入ったら「道具屋」コマンドが表示される。
普段は非表示だがある特定の条件を満たすとフラグをtrueにし、そのフラグによってメニューを表示するルーチンを考えた。
メニューの描画やらはフラグを持たせればどうにでもなるので、どのメニューを選択しているかを返す(計算する)関数である。
使用不使用のbool値、なんのメニューか解り易いstring型、更にメニュー返却用の構造体番号を代入する変数を含む構造体を用意する
(最後の変数、これはnSelectNumを返してもいいんだが)
テスト用として適当な要素の構造体にbool値にfalseを代入して動作確認。 動作OK!
これで動的にメニューを生成し、どのメニューを選択しているかを判定するロジックが整った。
こんなでも日常生活を送りながら一日半位考えた。実装もテストしながら一時間位掛かってしまった。
► スポイラーを表示
CODE:
#include "DxLib.h"
#include"class.h"
#include
using namespace std;
//メニュー用構造体
typedef struct{
bool bUseFlag;
string MenuName;
int ReturnNum;
}Menu;
//宣言しておく
Menu MenuStr[5];
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
char szBuff[256];
InputCheck cp;
int nSelectNum = 0;
//初期化
for(int i = 0;i < 5;++i){
MenuStr[i].bUseFlag = true;
sprintf(szBuff,"MenuName %d",i);
MenuStr[i].MenuName = szBuff;
MenuStr[i].ReturnNum = i;
}
int counter = 0;
Menu *lpMenu = MenuStr;
int MenuElementNum = sizeof(MenuStr)/sizeof(MenuStr[0]);
//二番目を使用しないようにする(テスト)
MenuStr[0].bUseFlag = false;
MenuStr[1].bUseFlag = false;
MenuStr[4].bUseFlag = false;
//上から初期値を探す
for(int i = 0;i < MenuElementNum;++i){
if(MenuStr[i].bUseFlag == true){
nSelectNum = i;
break;
}
}
//ここに処理を記述してください
while(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && InputCheck::gpUpdateKey()==0){
if(cp.ReturnInputKey(KEY_INPUT_UP) == 1){
nSelectNum = ( nSelectNum + (MenuElementNum -1) ) % MenuElementNum; // 現在の選択項目を一つ下にずらす(ループする)
if(MenuStr[nSelectNum].bUseFlag == false){//不使用ならば次を探す
while(true){
nSelectNum = ( nSelectNum + (MenuElementNum -1) ) % MenuElementNum;
if(MenuStr[nSelectNum].bUseFlag == true){
break;
}
}
}
}
if(cp.ReturnInputKey(KEY_INPUT_DOWN) == 1){
nSelectNum = ( nSelectNum + (MenuElementNum + 1) ) % MenuElementNum; // 現在の選択項目を一つ下にずらす(ループする)
if(MenuStr[nSelectNum].bUseFlag == false){//不使用ならば次を探す
while(true){
nSelectNum = ( nSelectNum + (MenuElementNum + 1) ) % MenuElementNum;
if(MenuStr[nSelectNum].bUseFlag == true){
break;
}
}
}
}
DrawFormatString(0,0,GetColor(255,255,255),"選択中のメニュー項目 : %s selectNumber = %d",lpMenu[nSelectNum].MenuName.c_str(),nSelectNum);
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}