メニュー選択画面について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
茶くれ爺

メニュー選択画面について

#1

投稿記事 by 茶くれ爺 » 16年前

初歩的な質問なのかもしれませんが
33章の選択画面で選んだとき
次のページ(新しいページ?)に飛ぶまた戻るの感覚がわからないのですが
どのように考えればばよいのでしょうか
よろしくお願いします

s-rush

Re:メニュー選択画面について

#2

投稿記事 by s-rush » 16年前

switch文でうまくできそうではないですか?

たとえば、
#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;
}


途中のfunc関数は適当に作ってあります^^;
このように、ステートのようなもので制御してあげれば、
(プログラム中ではswitch文のところです)
次のページに飛ぶ(?)ようなことができますよ^^

短時間で作ったものなので、改善の余地はたくさんあるかとは思いますが、
基本的な考えはこれで十分かと思います。

(余談)
無駄に関数を作りすぎちゃいました(笑)

茶くれ爺

Re:メニュー選択画面について

#3

投稿記事 by 茶くれ爺 » 16年前

なるほどーーこういいう考え方ができるんですねー
とても助かりましたありがとうございました

もう一つ質問なんですけど実行してみて 下キーを押しながらZキーを押すとページが
移ってしまうんですけどどう改善すればよろしいんでしょうか

たびたび申し訳ありませんよろしくお願いします

Ace

Re:メニュー選択画面について

#4

投稿記事 by Ace » 16年前

Zキー判定のところを
if (![矢印キーが押されているか] && [Zキーが押されているか]) {
    // 移動
    switch () {
        ...
    }
}
のようにすればよいと思います。
もっとも、矢印キー押しているときも決定ができる(ランダム選択な感じ)というのも有りかもしれませんけどね。

茶くれ爺

Re:メニュー選択画面について

#5

投稿記事 by 茶くれ爺 » 16年前

ありがとうございます
やってみたところ矢印を押しながらZを押すと移動する
現象は改善されましたが
下 を押したのち Zを押すと移動してしまいます
どうしたらよいでしょうか

Mato

Re:メニュー選択画面について

#6

投稿記事 by Mato » 16年前

初めまして。

その“移動”と言うのは、貴方の要望であった「次のページ(新しいページ?)に飛ぶ」ことではないのでしょうか。
ですから、「移動してしまいます」と言われますと、何がしたかったのか謎くなってしまいますw

私の勘違いでしたらすいません。

conio

Re:メニュー選択画面について

#7

投稿記事 by conio » 16年前

上記のプログラムでは、キー入力判定をする関数を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のところに入れたほうが良いのではないのでしょうか。

茶くれ爺

Re:メニュー選択画面について

#8

投稿記事 by 茶くれ爺 » 16年前

無事この問題はずべて解決いたしました。
皆さんありがとうございました

s-rush

Re:メニュー選択画面について

#9

投稿記事 by s-rush » 16年前

最近忙しくて返事が返せませんでした。
本当に申し訳ないです><

上記のプログラムは、ゲームプログラミングの館33章をそのまま流用し、
ページ移動のプログラムを付け足しただけなので、
下キーを押したままでもZキーに反応してしまいます。

Aceさんのおっしゃるように変更すれば、改善されます
(すでに確認済みですね^^;)


>conioさん
解説とご指摘ありがとうございます^^
一応、上記のプログラムを改造してキー入力をすべてのcaseにも反映できるようにと、
switchの外に出しちゃいました^^;
ここではkey_calc();はcase 0に入れた方がよかったですねorz

閉鎖

“C言語何でも質問掲示板” へ戻る