ステージの開始時間
Posted: 2008年11月13日(木) 16:24
龍神録プログラミングの館50章の段階では、プログラムを実行したとき、いきなりステージ画面から始まりますが、その前にキャラクター選択画面などを挿入したいときどう変えればいいのでしょうか?
つまりステージ0の開始時間を自分で設定するにはどこをどういじればいいのでしょう・・。
つまりステージ0の開始時間を自分で設定するにはどこをどういじればいいのでしょう・・。
まずメイン関数の仕様を確認してください。スイッチ文で実行したい関数を制御していますよね?
func_stateの値を任意に変更することで、呼びたい関数が制御できます。
例えばメニューを表示する関数をmenu()として作ったとして、
func_stateが10の時にmenu()を呼びたいとします。
初期化処理が済んだとき、func_stateを10にするようにしてください。
すると初期化が済んだとき、この関数が呼ばれます。
シューティング画面にしたいときは、シューティングの画面の関数を呼ぶ値にfunc_stateを変更してください。
このことをプログラムを見ながら確認してみます。
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
while(ProcessLoop()==0){//メインループ
music_ini();
switch(func_state){
case 0://初回のみ入る処理
load(); //データロード
first_ini();//初回の初期化
func_state=99;
break;
case 99://STGを始める前に行う初期化
ini();
load_story();
func_state=100;
break;
case 100://通常処理
enter_func_tm("最初");
calc_ch(); enter_func_tm("キャラ計算");
ch_move(); enter_func_tm("キャラ移動");
cshot_main(); enter_func_tm("自機ショットメイン");
enemy_main(); enter_func_tm("敵処理メイン");
boss_shot_main();enter_func_tm("ボスショットメイン");
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("描画メイン");
bgm_main(); enter_func_tm("BGMメイン");
if(boss.flag==0)
stage_count++;
break;
default:
printfDx("不明なfunc_state\n");
break;
}
music_play(); enter_func_tm("音楽再生");
fps_wait(); enter_func_tm("待機した時間",1);
if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
ScreenFlip();//裏画面反映
count++;
}
DxLib_End();//DXライブラリ終了処理
return 0;
}
処理は最初case 0に入ってデータのロードや色々と最初の初期化処理がされます。
func_state=99;
があるので、次は99に入ります。
ここではシューティングゲームについての初期化やシューティングの設定のロードなどが行われます。
func_state=100;
があるので、次には100に入ります。
100で普通にシューティングの処理がされています。
では先ほど言ったようにcase 10でメニューの処理をしてみます。
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
while(ProcessLoop()==0){//メインループ
music_ini();
switch(func_state){
case 0://初回のみ入る処理
load(); //データロード
first_ini();//初回の初期化
func_state=10;
break;
case 10:
DrawString(0, 0,"メニュー表示しています。",GetColor(255,255,255));
DrawString(0,20,"Zキーを押すとシューティングを開始します。",GetColor(255,255,255));
if( CheckStatePad(configpad.shot ) == 1 ){
func_state = 99;
}
break;
case 99://STGを始める前に行う初期化
ini();
load_story();
func_state=100;
break;
case 100://通常処理
enter_func_tm("最初");
calc_ch(); enter_func_tm("キャラ計算");
ch_move(); enter_func_tm("キャラ移動");
cshot_main(); enter_func_tm("自機ショットメイン");
enemy_main(); enter_func_tm("敵処理メイン");
boss_shot_main();enter_func_tm("ボスショットメイン");
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("描画メイン");
bgm_main(); enter_func_tm("BGMメイン");
if(boss.flag==0)
stage_count++;
break;
default:
printfDx("不明なfunc_state\n");
break;
}
music_play(); enter_func_tm("音楽再生");
fps_wait(); enter_func_tm("待機した時間",1);
if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
ScreenFlip();//裏画面反映
count++;
}
DxLib_End();//DXライブラリ終了処理
return 0;
}
このようにcaseで好きな処理を分けてください。
fps制御や音楽ファイル管理などは共通しているので、毎回呼ばれるようになっています。
case 10: DrawString(0, 0,"メニュー表示しています。",GetColor(255,255,255)); if( CheckStatePad(configpad.shot ) == 1 ){ DrawString(0,20,"Zキーを押すとシューティングを開始します。",GetColor(255,255,255)); } if( CheckStatePad(configpad.shot ) == 1 ){ func_state = 99; } break;としてみたのですが、一度shotキーを押すと一気にcase99に飛んでしまい、上手くいきません。
case 10: DrawString(0, 0,"メニュー表示しています。",GetColor(255,255,255)); if( CheckStatePad(configpad.bom ) == 1 ){ DrawString(0,20,"Zキーを押すとシューティングを開始します。",GetColor(255,255,255)); } if( CheckStatePad(configpad.shot ) == 1 ){ func_state = 99; } break;”Zキーを押すとシューティングを開始します。”という文が、キーを押した瞬間しか表示されません。
case 10: "メニューを表示しています。"を表示; if(shotキー押下){ func_state = 11; } case 11: "メニューを表示しています。"を表示; "Zキーを押すとシューティングを開始します。"を表示; if(Zキー押下){ func_state = 99; }
最初はだいたいの説明をするので、自分で調べて解決してみて下さい。 その方が今後の為になると思いますので。 まず、関数の仕様を確認して下さい。 CheckStatePad ってどういう関数でしたっけ?返って来るのは何でしたっけ? 後、 if(条件式1){ //1; } if(条件式1){ //2; } と書くと1も2も同時に実行されてしまいますよね。実行する条件が同じなんですから。 この辺に気をつけて書いてみて下さい。