オプション画面で矢印キーで選択し、Zで決定に設定しているのですがカーソルが
Zを押しても動いてしまうし、Rを押すとタイトルに戻るようにしたと思うのですが画面が真っ暗で指定した キーを押すと他画面に移ることはできてしまうという。
この原因がわからなくて悩んでいます。どうかよろしくおねがいします。
#include "DxLib.h"
#include <stdio.h>
int function_status;
int White, Red, G_Blue;
int menuImg;
int optionImg;
int stageImg;
int selectImg;
int ItemImg;
int cursorPos;
char KeyBuf[256];
void setState( int );
void Menu();
void Sselect();
void Option();
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode( TRUE ) ; //ウィンドウモードに変更
SetGraphMode( 800 , 600 , 32 ) ;
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
White = GetColor( 255 , 255 , 255 ) ; //色の取得
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定
while( 1 )
{
ClearDrawScreen(); // 裏画面のデータを全て削除
GetHitKeyStateAll( KeyBuf ); // すべてのキーの状態を得る
switch( function_status )
{
case 0: Menu(); break;
case 1: Sselect(); break;
case 3: Option(); break;
case 4: Menu(); break;
case 5: Option(); LoadGraphScreen( 410 , 50 , "EN1.bmp" , TRUE ); break;
case 6: Option(); LoadGraphScreen( 410 , 50 , "EN2.bmp" , TRUE ); break;
case 7: Option(); LoadGraphScreen( 410 , 50 , "EN3.bmp" , TRUE ); break;
case 8: Option(); LoadGraphScreen( 410 , 50 , "EN4.bmp" , TRUE ); break;
default: DxLib_End(); return 0; break; // DXライブラリ使用の終了処理
}
if( ProcessMessage() == -1 ) break; // エラーが起きたら終了
ScreenFlip(); // 裏画面データを表画面へ反映
}
DxLib_End();
return 0;
}
void setState( int state )/*追加*/
{
function_status = state;
cursorPos = 0;
}
void Menu()
{
//menuImg = LoadGraph( "back1.bmp" );
//DrawGraph( 0, 0, menuImg, FALSE ); // 画像を表示
DrawString( 320, 300, "スタート", White );
if( KeyBuf[KEY_INPUT_S] == 1 )
setState( 1 );
DrawString( 320, 340, "オプション", White );
if( KeyBuf[KEY_INPUT_O] == 1 )
setState( 3 );
DrawString( 320, 380, "終了", White );
if( KeyBuf[KEY_INPUT_E] == 1 )
setState( 8 );
}
void Sselect()
{
//selectImg = LoadGraph( "bg1.png" );/*追加*/
//DrawGraph( 0, 0, selectImg, FALSE ); // 画像を表示
LoadGraphScreen( 280 , 450 , "triangul_L.bmp" , TRUE );
LoadGraphScreen( 480 , 450 , "triangul_R.bmp" , TRUE );
DrawString( 660, 560, "もどる(R)", White );
if( KeyBuf[KEY_INPUT_[/url] == 1 )
setState( 4 );
while(ProcessMessage() == 0 && CheckHitKeyAll() != 0 ){}
while(ProcessMessage() == 0 && CheckHitKeyAll() == 0 ){}
if( KeyBuf[KEY_INPUT_RIGHT ] == 1 )
LoadGraphScreen( 227 , 120 , "サンプル2.bmp" , TRUE );
if( KeyBuf[KEY_INPUT_RIGHT ] == 1 )
LoadGraphScreen( 315 , 450 , "Stage2.bmp" , TRUE );
if( KeyBuf[KEY_INPUT_LEFT ] == 1 )
LoadGraphScreen( 227 , 120 , "サンプル1.bmp" , TRUE );
if( KeyBuf[KEY_INPUT_LEFT ] == 1 )
LoadGraphScreen( 315 , 450 , "Stage.bmp" , TRUE );
if( KeyBuf[KEY_INPUT_Z] != 0 ) // 決定処理
{
switch( cursorPos )
{
case 0: setState( 2 ); break;
//
default: break;
}
}
}
void Option()
{
optionImg = LoadGraph( "back2.bmp" );/*追加*/
DrawGraph( 0, 0, optionImg, FALSE ); // 画像を表示
White = GetColor( 0, 0, 0 ); // 白色の値を取得
Red = GetColor( 255, 0, 0 ); // 赤色の値を取得
G_Blue = GetColor( 0, 255, 255 ); // 緑と青の混合色の値を取得
DrawString( 60, 60, "??????", White );
if( KeyBuf[KEY_INPUT_1] == 1 )
setState( 5 );
DrawString( 60, 90, "??????", White );
if( KeyBuf[KEY_INPUT_2] == 1 )
setState( 6 );
DrawString( 60, 120, "??????", White );
if( KeyBuf[KEY_INPUT_3] == 1 )
setState( 7 );
DrawString( 60, 150, "??????", White );
if( KeyBuf[KEY_INPUT_4] == 1 )
setState( 8 );
DrawString( 160, 250, "変更", White);
DrawString( 660, 560, "もどる(R)", White );
if( KeyBuf[KEY_INPUT_[/url] == 1 )
setState( 4 );
//カーソル移動処理
const int HEAD = 0;
const int TAIL = 3;
while(ProcessMessage() == 0 && CheckHitKeyAll() != 0 ){}
while(ProcessMessage() == 0 && CheckHitKeyAll() == 0 ){}
//カーソル描画
DrawBox( 43 , 60 + cursorPos * 30 , 59 , 60 + cursorPos * 30 + 16 , GetColor( 255 , 255 , 0 ) , TRUE ) ;
if( KeyBuf[KEY_INPUT_UP] == 1 )
cursorPos = (cursorPos == HEAD) ? TAIL : (cursorPos - 1);
if( KeyBuf[KEY_INPUT_DOWN] == 1 )
cursorPos = (cursorPos == TAIL) ? HEAD : (cursorPos + 1);
if( KeyBuf[KEY_INPUT_Z] != 0 ) // 決定処理
{
switch( cursorPos )
{
case 0: setState( 5 ); break;
case 1: setState( 6 ); break;
case 2: setState( 7 ); break;
case 3: setState( 8 ); break;
case 4: setState( 4 ); break;
//
default: break;
}
}
}
原因がよくわからないのですが
Re:原因がよくわからないのですが
まず、規約を一通り読んでください。
プレタグ、インデント、どちらもされてません。
いろいろ突っ込む点がありますが、
とりあえず、ブレークポイントを張って、
・キーが押された時
・Menu()に戻ったとき
などの各変数の状態を追って行ってください。
「このタイミングでこの変数に入っている値はおかしいだろ・・・」
ってのが見つけられるかと思います。
プレタグ、インデント、どちらもされてません。
いろいろ突っ込む点がありますが、
とりあえず、ブレークポイントを張って、
・キーが押された時
・Menu()に戻ったとき
などの各変数の状態を追って行ってください。
「このタイミングでこの変数に入っている値はおかしいだろ・・・」
ってのが見つけられるかと思います。