バグは、選択画面の状態で最初に選ばれている選択肢から下にスクロールすると、一瞬で元の選択肢にもどってきてしまうものです。
また、これに加えて selectnum=0のときにzキーを押す(ゲームスタートが選ばれた状態)と、表示画面が切り替わる動作を付け加えたいのですが、この動作はif( Key[ KEY_INPUT_Z] == 1 )をif( Key[ KEY_INPUT_Z] == 1 )&&(selectNum=0)にただ単に変えればいいのでしょうか?
selectNumはvoid show menuの下部にあるので、未定義の状態になり、実行できないと予想しています。この部分はselectNumをvoid show menuの
最上部に書くことで解決されるのでしょうか。
どうぞよろしくお願い致します。
#include "DxLib.h"
enum STATUS{ //列挙型(enum)は、一定の範囲の値を保持するためのデータ型です。
STATUS_SHOW_MENU,
STATUS_SHOW_CHARA,
};
int Key[256]; // キーが押されているフレーム数を格納する
STATUS Status = STATUS_SHOW_MENU;
// キーの入力状態を更新する
int gpUpdateKey(){
char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
for( int i=0; i<256; i++ ){
if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
Key[i]++; // 加算
} else { // 押されていなければ
Key[i] = 0; // 0にする
}
}
return 0;
}
void ShowMenu(){
if( Key[ KEY_INPUT_Z] == 1 ){
Status = STATUS_SHOW_CHARA;
}
// メニュー項目の表示に必要な構造体を用意する
typedef struct{
int x, y; // 座標格納用変数
char name[128]; // 項目名格納用変数
} MenuElement_t ;
// メニュー項目要素を5つ作る
MenuElement_t MenuElement[5]={
{ 80, 100, "ゲームスタート" }, // タグの中身の順番で格納される。xに80が、yに100が、nameに"ゲームスタート"が
{ 100, 150, "おまけ" },
{ 100, 200, "ヘルプ" },
{ 100, 250, "コンフィグ" },
{ 100, 300, "ゲーム終了" },
};
int SelectNum = 0; // 現在の選択番号
// 計算フェーズ
if( Key[ KEY_INPUT_DOWN ] == 1 ){ // 下キーが押された瞬間だけ処理
SelectNum = ( SelectNum + 1 ) % 5; // 現在の選択項目を一つ下にずらす(ループする)
for( int i=0; i<5; i++ ){ // メニュー項目数である5個ループ処理
if( i == SelectNum ){ // 今処理しているのが、選択番号と同じ要素なら
MenuElement[i].x = 80; // 座標を80にする
}
else { // 今処理しているのが、選択番号以外なら
MenuElement[i].x = 100;// 座標を100にする
}
}
}
// 描画フェーズ
for( int i=0; i<5; i++ ){ // メニュー項目を描画
DrawFormatString( MenuElement[i].x, MenuElement[i].y, GetColor(255,255,255), MenuElement[i].name );
}
}
void ShowChara(){
if( Key[ KEY_INPUT_X] == 1 ){
Status = STATUS_SHOW_MENU;
}
DrawString(0,0,"キャラ表示中",GetColor(255,255,255));
}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){
switch( Status ){
case STATUS_SHOW_MENU:
ShowMenu();
break;
case STATUS_SHOW_CHARA:
ShowChara();
break;
}
} //while間のループは1フレームごとに描写、メッセージの描写、裏画面処理をしている。そして、show Menu、つまりxを押すとその処理が実行される
DxLib_End();
return 0;
}