こんばんは。
ここで質問したいことができたので投稿させていただきます。
環境はWin7、VC++2008EE
C言語初心者です。
新・ゲームプログラミングの館と龍神録のサイトでシューティングゲームの勉強をさせてもらっています。
先日、新・ゲームプログラミングの館で、「メニュー画面の作り方」を学ばせてもらいました。
そこで、以前から龍神録のサイトを参考に組んできたゲーム本体プログラムと先日学んだメニュー画面のプログラムをうまくかみ合わせようと思い、コードを書いたのですが、
現在はメニューを構成する関数の一つに、ショットボタンが押されたら1を返す関数を用意して、1を返したときにメイン関数内のfunc_stateという変数がゲームに必要な初期化やロードを行うケースにswitchで飛ぶようにしていますが、うまくかみ合わないようで苦戦しています。症状としては、タイトル画面からゲーム待機画面にいき、その画面でショットボタンを押したらゲーム本体へ移行させたいのですが、実際はタイトル画面から待機画面をすっ飛ばし(一瞬だけ待機画面が映る)
、ゲーム本体へいってしまうという具合です。
私が伺いたいのは、メニュー画面からゲーム本体にいきたいとき、どのような方法があるのかということです。いくつか定石の方法はあるのでしょうが、それらを教えていただきたいです。
新・ゲームプログラミングの館のメニュー画面・・・
Re: 新・ゲームプログラミングの館のメニュー画面・・・
定石が知りたいのであれば、ここで「タイトル画面」等で検索するのが手っ取り早いと思います。(うまく貼れるか分かりませんが、)これとか該当するんじゃないでしょうか。
http://dixq.net/forum/viewtopic.php?f=3&t=8584
コードを載せない限り、具体的な解決策を挙げるのは難しいと思うので、コードを載せたらいかがでしょう。今後、同じ問題で困っている人も助かるかもしれませんし。
待機画面が一瞬で終わるのなら、待機画面でループしていないのかもしれません。
http://dixq.net/forum/viewtopic.php?f=3&t=8584
コードを載せない限り、具体的な解決策を挙げるのは難しいと思うので、コードを載せたらいかがでしょう。今後、同じ問題で困っている人も助かるかもしれませんし。
待機画面が一瞬で終わるのなら、待機画面でループしていないのかもしれません。
Re: 新・ゲームプログラミングの館のメニュー画面・・・
zxcさん、ありがとうございます。
参考にさせていただきます。
やはり、初心者なので、自分で考えたいなと思い、あえてコードはお見せしなかったのですが、たしかに他の人の助けになるなら載せるべきかもしれません汗
ただ、教えていただいたように、まずは先駆けの質問などを参考にとりあえず自分でやってみます。
それでいて解決できそうになかったら、コードを載せて皆さんにアドバイスをいただきたいです。
参考にさせていただきます。
やはり、初心者なので、自分で考えたいなと思い、あえてコードはお見せしなかったのですが、たしかに他の人の助けになるなら載せるべきかもしれません汗
ただ、教えていただいたように、まずは先駆けの質問などを参考にとりあえず自分でやってみます。
それでいて解決できそうになかったら、コードを載せて皆さんにアドバイスをいただきたいです。
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: 新・ゲームプログラミングの館のメニュー画面・・・
どのようなコードになっているのか想像できませんが、
書いてはならない処理
http://dixq.net/g/h_11.html
に該当しないコードになっていますか?
タイトル画面→ゲーム待機画面→ゲーム画面 と遷移させたいのですよね?
それであれば単純に
case タイトル画面: タイトル画面処理(); break;
case ゲーム待機画面: ゲーム待機処理(); break;
case ゲーム画面: ゲーム画面処理(); break;
ではダメなのですか?
書いてはならない処理
http://dixq.net/g/h_11.html
に該当しないコードになっていますか?
タイトル画面→ゲーム待機画面→ゲーム画面 と遷移させたいのですよね?
それであれば単純に
case タイトル画面: タイトル画面処理(); break;
case ゲーム待機画面: ゲーム待機処理(); break;
case ゲーム画面: ゲーム画面処理(); break;
ではダメなのですか?
Re: 新・ゲームプログラミングの館のメニュー画面・・・
一瞬画面が映るということなので、
タイトル画面でボタンを押す
↓
待機画面でまだボタンが押されている
↓
ゲームスタート
ということになっているのでは?
タイトル画面でボタンを押す
↓
待機画面でまだボタンが押されている
↓
ゲームスタート
ということになっているのでは?
Re: 新・ゲームプログラミングの館のメニュー画面・・・
皆さん、回答ありがとうございます。
どうしてもわからないので、やはりコードを載せさせていただきます。
です。
症状は、TitleSelect()でSTATE_SENTAKUにして、待機画面にして、そこでショットボタンを押すとゲームに必要なロード、初期化→ゲーム本体というふうにしたいのに、
TitleSelect()でSTATE_SENTAKUにすると、一瞬だけ待機画面の画像が映り、すぐにゲーム本体にはいってしまうというものです。
でも、たとえば、ショットボタンでタイトルから待機画面、待機画面でスローボタンを押すとゲーム本体に移行するようにコードを書くと待機画面が飛ばされず、ゲーム画面へ行きます。
どうやら、ショットボタンでタイトルから待機画面、ショットボタンで待機画面からゲーム画面、という風に同じボタンだと一気にいってしまうように感じます。
アドバイスをいただけないでしょうか。
どうしてもわからないので、やはりコードを載せさせていただきます。
#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: 新・ゲームプログラミングの館のメニュー画面・・・
if(CheckStatePad(configpad.shot)!=0){
なので、キーを押していれば次に遷移します。
if(CheckStatePad(configpad.shot)==1){
など押された1回めだけ反応する言うことを明確に書きましょう。
あと関数名と機能がズレているのが気になります。
Draw系でキー判定するのは止めた方が良いでしょう。
それとか「待機画面」と呼んでいるのに Draw_Sentakuではこちらも混乱します。
名称には一貫性をもたせましょう。
なので、キーを押していれば次に遷移します。
if(CheckStatePad(configpad.shot)==1){
など押された1回めだけ反応する言うことを明確に書きましょう。
あと関数名と機能がズレているのが気になります。
Draw系でキー判定するのは止めた方が良いでしょう。
それとか「待機画面」と呼んでいるのに Draw_Sentakuではこちらも混乱します。
名称には一貫性をもたせましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 新・ゲームプログラミングの館のメニュー画面・・・
softyaさん、ありがとうございます。
無事に動くようになりました。
また、即席のコードだったため、わかりにくく、雑なコードで質問してしまい、すみませんでした。
以後、気をつけます。
無事に動くようになりました。
また、即席のコードだったため、わかりにくく、雑なコードで質問してしまい、すみませんでした。
以後、気をつけます。