はじめて投稿します。
龍神録プログラムの館を参考にシューティングゲームを作製しています。
2面以降を作ろうとしているのですが、ステージ切り替えるにはどのような処理を行うのがベストなのかで迷っています。いまのところ、1面とは別の2面用の初期化関数を読み込んでステージを切り替えようと思っているのですが、他にいい方法はありませんか?
あと、スコアランキングをゲームオーバーとクリア時に表示したいのですが、やり方が全くわかりません。教えてください><
シューティングゲーム
Re:シューティングゲーム
物事の「状態」を管理する方法はたくさんあります。
単純な例としては、
switch case
があります。
たとえば
もう少しつっこんだ方法では、
「関数ポインタ」や
C++になりますが、デザインパターンの「stateパターン」
などがあります。
こういった種類の動作をさせるプログラムに挑戦していってはいかがでしょうか?
また、スコアランキングなどは完全に別トピックとなりますので、
分割して取り掛かることをオススメします。
また、蛇足かもしれませんが、スコアランキングを作成するときに「具体的に」どこでつまずくか?
を書かれると解決の早道になると思われます
ご一考ください
単純な例としては、
switch case
があります。
たとえば
enum State{ Opening, Play, Ending, }; とあって、 State g_State = Opening; switch(g_State) { case Opening: オープニングの関数(); break; ...略 }とg_Stateで場面を切り替えることが可能です。
もう少しつっこんだ方法では、
「関数ポインタ」や
C++になりますが、デザインパターンの「stateパターン」
などがあります。
こういった種類の動作をさせるプログラムに挑戦していってはいかがでしょうか?
また、スコアランキングなどは完全に別トピックとなりますので、
分割して取り掛かることをオススメします。
また、蛇足かもしれませんが、スコアランキングを作成するときに「具体的に」どこでつまずくか?
を書かれると解決の早道になると思われます
ご一考ください
Re:シューティングゲーム
切り替え方とはまた違うのかもしれませんが、
http://www.play21.jp/board/formz.cgi?ac ... &rln=64503
で2面の作り方について管理人さんが回答してくれています。参考にどうぞ。
http://www.play21.jp/board/formz.cgi?ac ... &rln=64503
で2面の作り方について管理人さんが回答してくれています。参考にどうぞ。
Re:シューティングゲーム
1面が終わったかどうかは、
boss_shot.cppの
//ボスの弾幕メイン
void boss_shot_main(){
・・・(略)・・・
if(boss.state==2 && (boss.hp<=0 || boss.endtime<=0)){//弾幕中で体力が無くなったら
se_flag[1]=1;//敵のピチュリ音
se_flag[11]=1;
input_phy(30);//30カウントで定位置に戻す
memset(&boss_shot,0,sizeof(boss_shot_t));//ボスの弾幕情報を初期化
memset(&lazer,0,sizeof(lazer_t)*LAZER_MAX);//ボスのレーザー情報を初期化
flash.flag=0;//フラッシュを消す
if(boss.knd==boss.danmaku_num[0] || boss.knd==boss.danmaku_num[1]){//出すべき弾幕をだしきったら
boss.flag=0;//消す
enter_dn(10,40);//(45)
se_flag[9]=1;//ボスが死んだ音
return ;
}
ここでボスを倒したかどうかが解ります。
boss.knd==boss.danmaku_num[0]の時中ボスを倒したことがわかり、
boss.knd==boss.danmaku_num[1]の時ラスボスを倒したことがわかります。
1面が終わった時は、後者なので、ここで判定するとよいでしょう。
スコアボードを表示したいなら、スコアボード表示フラグをこの瞬間立て、
スコアボードを表示してやれば良いかと思います。
boss_shot.cppの
//ボスの弾幕メイン
void boss_shot_main(){
・・・(略)・・・
if(boss.state==2 && (boss.hp<=0 || boss.endtime<=0)){//弾幕中で体力が無くなったら
se_flag[1]=1;//敵のピチュリ音
se_flag[11]=1;
input_phy(30);//30カウントで定位置に戻す
memset(&boss_shot,0,sizeof(boss_shot_t));//ボスの弾幕情報を初期化
memset(&lazer,0,sizeof(lazer_t)*LAZER_MAX);//ボスのレーザー情報を初期化
flash.flag=0;//フラッシュを消す
if(boss.knd==boss.danmaku_num[0] || boss.knd==boss.danmaku_num[1]){//出すべき弾幕をだしきったら
boss.flag=0;//消す
enter_dn(10,40);//(45)
se_flag[9]=1;//ボスが死んだ音
return ;
}
ここでボスを倒したかどうかが解ります。
boss.knd==boss.danmaku_num[0]の時中ボスを倒したことがわかり、
boss.knd==boss.danmaku_num[1]の時ラスボスを倒したことがわかります。
1面が終わった時は、後者なので、ここで判定するとよいでしょう。
スコアボードを表示したいなら、スコアボード表示フラグをこの瞬間立て、
スコアボードを表示してやれば良いかと思います。