新・ゲームプログラミングの館のメニュー画面・・・

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

新・ゲームプログラミングの館のメニュー画面・・・

#1

投稿記事 by umo » 11年前

こんばんは。
ここで質問したいことができたので投稿させていただきます。
環境はWin7、VC++2008EE
C言語初心者です。

新・ゲームプログラミングの館と龍神録のサイトでシューティングゲームの勉強をさせてもらっています。
先日、新・ゲームプログラミングの館で、「メニュー画面の作り方」を学ばせてもらいました。
そこで、以前から龍神録のサイトを参考に組んできたゲーム本体プログラムと先日学んだメニュー画面のプログラムをうまくかみ合わせようと思い、コードを書いたのですが、
現在はメニューを構成する関数の一つに、ショットボタンが押されたら1を返す関数を用意して、1を返したときにメイン関数内のfunc_stateという変数がゲームに必要な初期化やロードを行うケースにswitchで飛ぶようにしていますが、うまくかみ合わないようで苦戦しています。症状としては、タイトル画面からゲーム待機画面にいき、その画面でショットボタンを押したらゲーム本体へ移行させたいのですが、実際はタイトル画面から待機画面をすっ飛ばし(一瞬だけ待機画面が映る)
、ゲーム本体へいってしまうという具合です。
私が伺いたいのは、メニュー画面からゲーム本体にいきたいとき、どのような方法があるのかということです。いくつか定石の方法はあるのでしょうが、それらを教えていただきたいです。

zxc
記事: 79
登録日時: 11年前
住所: 日本の背骨(?)あたり

Re: 新・ゲームプログラミングの館のメニュー画面・・・

#2

投稿記事 by zxc » 11年前

  定石が知りたいのであれば、ここで「タイトル画面」等で検索するのが手っ取り早いと思います。(うまく貼れるか分かりませんが、)これとか該当するんじゃないでしょうか。
http://dixq.net/forum/viewtopic.php?f=3&t=8584

  コードを載せない限り、具体的な解決策を挙げるのは難しいと思うので、コードを載せたらいかがでしょう。今後、同じ問題で困っている人も助かるかもしれませんし。

待機画面が一瞬で終わるのなら、待機画面でループしていないのかもしれません。

umo

Re: 新・ゲームプログラミングの館のメニュー画面・・・

#3

投稿記事 by umo » 11年前

zxcさん、ありがとうございます。
参考にさせていただきます。
やはり、初心者なので、自分で考えたいなと思い、あえてコードはお見せしなかったのですが、たしかに他の人の助けになるなら載せるべきかもしれません汗
ただ、教えていただいたように、まずは先駆けの質問などを参考にとりあえず自分でやってみます。
それでいて解決できそうになかったら、コードを載せて皆さんにアドバイスをいただきたいです。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 新・ゲームプログラミングの館のメニュー画面・・・

#4

投稿記事 by Dixq (管理人) » 11年前

どのようなコードになっているのか想像できませんが、
書いてはならない処理
http://dixq.net/g/h_11.html
に該当しないコードになっていますか?

タイトル画面→ゲーム待機画面→ゲーム画面 と遷移させたいのですよね?
それであれば単純に

case タイトル画面: タイトル画面処理(); break;
case ゲーム待機画面: ゲーム待機処理(); break;
case ゲーム画面: ゲーム画面処理(); break;

ではダメなのですか?

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: 新・ゲームプログラミングの館のメニュー画面・・・

#5

投稿記事 by ISLe » 11年前

一瞬画面が映るということなので、

タイトル画面でボタンを押す

待機画面でまだボタンが押されている

ゲームスタート

ということになっているのでは?

umo

Re: 新・ゲームプログラミングの館のメニュー画面・・・

#6

投稿記事 by umo » 11年前

皆さん、回答ありがとうございます。
どうしてもわからないので、やはりコードを載せさせていただきます。

コード:

#define GLOBAL_INSTANCE
#include "GV.h"



//ループで必ず行う3大処理
int ProcessLoop(){
		if(ProcessMessage()!=0) return -1;
		if(ClearDrawScreen()!=0) return -1;
		GetHitKeyStateAll_2();
		GetHitPadStateAll();
		return 0;
}



//タイトルセレクト
int TitleSelect(){
		Menumozi_t Menumozi[5]={
				{80,100,"ゲームスタート"},
				{100,150,"おまけ"},
				{100,200,"終了"},
		};
	        static int SelectNum;

		if(CheckStatePad(configpad.down)==1){//下キーが押されたとき
				SelectNum = (SelectNum+1)%3;
		}
		if(CheckStatePad(configpad.up)==1){//上キーが押されたとき
				SelectNum = (SelectNum+2)%3;
		}

		for(int i=0;i<5;i++){
				if(i==SelectNum){
						Menumozi[i].x = 80;
				}
				else{
						Menumozi[i].x = 100;
				}
		}
		
		for(int i=0;i<3;i++){
				DrawFormatString(Menumozi[i].x,Menumozi[i].y,GetColor(255,255,255),Menumozi[i].name);
		}
		if(SelectNum==0 && CheckStatePad(configpad.shot)!=0){
				return STATE_SENTAKU;
		}
		if(SelectNum==1 && CheckStatePad(configpad.shot)!=0){
				return STATE_OMAKE;
		}
		if(SelectNum==2 && CheckStatePad(configpad.shot)!=0){
				return STATE_END;
		}
		return STATE_TITLE;
}
	



int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
		ChangeWindowMode(TRUE);
		DxLib_Init();
		SetDrawScreen(DX_SCREEN_BACK);


		func_state = STATE_FIRST_ACT;
		
	
		
		while(ProcessLoop()==0 ){
				if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;

				
				music_ini();
				
				switch(func_state){
						case STATE_FIRST_ACT:
							load();
						    first_ini();
						    func_state=STATE_TITLE;
							break;
						case STATE_TITLE:
							Draw_Title();
							func_state = TitleSelect();
							break;
						case STATE_SENTAKU:
							func_state = Draw_Sentaku();
							break;
						case STATE_OMAKE:
							
							func_state = Draw_Omake();
							break;
				

				
						case STATE_SECOND_ACT://STGを始める前に行う初期化
                            ini();
							load_story();
						    func_state=STATE_GAME;
                            break;
						case STATE_GAME:
													enter_func_tm("最初");
                            calc_ch();			enter_func_tm("キャラ計算");
                            ch_move();			enter_func_tm("キャラ移動");
						    cshot_main();		enter_func_tm("自機ショットメイン");
                            enemy_main();		enter_func_tm("敵処理メイン");
						    shot_main();		enter_func_tm("ショットメイン");
						    boss_shot_main();	enter_func_tm("ボスショットメイン");
							out_main();			enter_func_tm("当たり判定");
							effect_main();      enter_func_tm("エフェクトメイン");
							calc_main();		enter_func_tm("計算メイン");
							graph_main();		enter_func_tm("描画メイン");
							if(boss.flag==0)
									stage_count++;
                            break;
				        default:
							printfDx("不明なfunc_state\n");
						    break;
				}
				music_play();                       enter_func_tm("音楽再生");
				fps_wait();                         enter_func_tm("待機した時間",1);


				
				

				ScreenFlip();
				count++;
		}
		
       

		DxLib_End();

		return 0;
}

コード:

//タイトル画面描画
void Draw_Title(){
		DrawGraph(35,0,img_title,TRUE);
}

//キャラ選択画面描画
int Draw_Sentaku(){
		DrawGraph(35,0,img_sentaku,TRUE);
		if(CheckStatePad(configpad.shot)!=0){
				return STATE_SECOND_ACT;
		}
		if(CheckStatePad(configpad.bom)!=0){
				return STATE_TITLE;
		}
		return STATE_SENTAKU;
}

//おまけ画面描画
int Draw_Omake(){
		DrawGraph(35,0,img_omake,TRUE);
		if(CheckStatePad(configpad.bom)!=0){
				return STATE_TITLE;
		}
		return STATE_OMAKE;
		
}
です。

症状は、TitleSelect()でSTATE_SENTAKUにして、待機画面にして、そこでショットボタンを押すとゲームに必要なロード、初期化→ゲーム本体というふうにしたいのに、
TitleSelect()でSTATE_SENTAKUにすると、一瞬だけ待機画面の画像が映り、すぐにゲーム本体にはいってしまうというものです。

でも、たとえば、ショットボタンでタイトルから待機画面、待機画面でスローボタンを押すとゲーム本体に移行するようにコードを書くと待機画面が飛ばされず、ゲーム画面へ行きます。
どうやら、ショットボタンでタイトルから待機画面、ショットボタンで待機画面からゲーム画面、という風に同じボタンだと一気にいってしまうように感じます。

アドバイスをいただけないでしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 新・ゲームプログラミングの館のメニュー画面・・・

#7

投稿記事 by softya(ソフト屋) » 11年前

if(CheckStatePad(configpad.shot)!=0){
なので、キーを押していれば次に遷移します。
if(CheckStatePad(configpad.shot)==1){
など押された1回めだけ反応する言うことを明確に書きましょう。

あと関数名と機能がズレているのが気になります。
Draw系でキー判定するのは止めた方が良いでしょう。
それとか「待機画面」と呼んでいるのに Draw_Sentakuではこちらも混乱します。
名称には一貫性をもたせましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

umo

Re: 新・ゲームプログラミングの館のメニュー画面・・・

#8

投稿記事 by umo » 11年前

softyaさん、ありがとうございます。
無事に動くようになりました。
また、即席のコードだったため、わかりにくく、雑なコードで質問してしまい、すみませんでした。
以後、気をつけます。

閉鎖

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