メニュー選択画面について
Posted: 2009年9月21日(月) 21:47
初歩的な質問なのかもしれませんが
33章の選択画面で選んだとき
次のページ(新しいページ?)に飛ぶまた戻るの感覚がわからないのですが
どのように考えればばよいのでしょうか
よろしくお願いします
33章の選択画面で選んだとき
次のページ(新しいページ?)に飛ぶまた戻るの感覚がわからないのですが
どのように考えればばよいのでしょうか
よろしくお願いします
#include "DxLib.h"
int state = 0;
int Key[256];
int White , y=100; //色とy座標の宣言
int GetHitKeyStateAll_2(int KeyStateBuf[/url]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key==1) KeyStateBuf++;
else KeyStateBuf=0;
}
return 0;
}
void char_disp(int White,int y){
DrawString( 150 , y , "■" , White );
DrawString( 170 , 100 , "NEW GAME" , White );
DrawString( 170 , 120 , "CONTINUE1" , White );
DrawString( 170 , 140 , "CONTINUE2" , White );
DrawString( 170 , 160 , "CONTINUE3" , White );
DrawString( 170 , 180 , "CONTINUE4" , White );
DrawString( 170 , 200 , "CONTINUE5" , White );
DrawString( 170 , 220 , "CONTINUE6" , White );
DrawString( 170 , 240 , "LOG OUT" , White );
}
/*キー入力制御関数*/
void key_calc(){
if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30)){
// たった今押したか、30カウンター以上押しっぱなしかつ5回に一度
y+=20;
if(y==260) // y座標が260なら(選択が一番下なら)
y=100; // 選択座標を一番上に
}
if(Key[KEY_INPUT_Z]==1){
switch (y) {
case 100: state=1; break;
case 120: state=2; break;
case 140: state=3; break;
case 160: state=4; break;
case 180: state=5; break;
case 200: state=6; break;
case 220: state=7; break;
case 240: state=8; break;
default: state=0; break;
}
}
}
void func1(){
DrawString(170, 160, "初めからだよ~ん", White);
if(Key[KEY_INPUT_X]==1){
state=0;
}
}
void func2(){
DrawString(170, 160, "メニュー1だよ~ん", White);
if(Key[KEY_INPUT_X]==1){
state=0;
}
}
void func3(){
DrawString(170, 160, "メニュー2だよ~ん", White);
if(Key[KEY_INPUT_X]==1){
state=0;
}
}
void func4(){
DrawString(170, 160, "メニュー3だよ~ん", White);
if(Key[KEY_INPUT_X]==1){
state=0;
}
}
void func5(){
DrawString(170, 160, "メニュー4だよ~ん", White);
if(Key[KEY_INPUT_X]==1){
state=0;
}
}
void func6(){
DrawString(170, 160, "メニュー5だよ~ん", White);
if(Key[KEY_INPUT_X]==1){
state=0;
}
}
void func7(){
DrawString(170, 160, "メニュー6だよ~ん", White);
if(Key[KEY_INPUT_X]==1){
state=0;
}
}
void func8(){
DrawString(170, 160, "ほんとにおわっちゃうの?", White);
if(Key[KEY_INPUT_X]==1){
state=0;
}
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
White = GetColor( 255 , 255 , 255 ) ; //色の取得
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
key_calc();
/*メニュー画面制御*/
switch(state){
case 0: char_disp(White,y); break; //メインメニュー
case 1: func1(); break;
case 2: func2(); break;
case 3: func3(); break;
case 4: func4(); break;
case 5: func5(); break;
case 6: func6(); break;
case 7: func7(); break;
case 8: func8(); break;
default : state = 0; break;
}
ScreenFlip();//裏画面反映
}
DxLib_End();
return 0;
}if (![矢印キーが押されているか] && [Zキーが押されているか]) {
// 移動
switch () {
...
}
}
のようにすればよいと思います。上記のプログラムでは、キー入力判定をする関数をswitch文の外に出してしまっているため、 状態遷移しても↓を押せばカーソルが移動してしまう仕様になってますね。 【1】初期状態 ------------------ ■NEW GAME CONTINUE1 CONTINUE2 CONTINUE3 CONTINUE4 CONTINUE5 CONTINUE6 LOG OUT ------------------ 【2】Zキーを押す ----------------- 初めからだよ~ん ----------------- 【3】この状態のまま↓キーを押す ----------------- 初めからだよ~ん ----------------- 【4】Xを押してメインに戻ると、カーソルが移動している。 ------------------ NEW GAME CONTINUE1 CONTINUE2 CONTINUE3 CONTINUE4 ■CONTINUE5 CONTINUE6 LOG OUT ------------------ key_calc();は、case0のところに入れたほうが良いのではないのでしょうか。