旧シューティングプログラミングの館を元にさせて頂きながら、
簡単なシューティングゲームを作っています。
そこで質問があるのですが。
どんな簡単なゲームでもタイトル画面があったり、自機のHPが0になったらゲームオーバー画面になったり、
ボスを倒したらクリア画面がでると思います。
旧シューティングプログラミングを元に作っている場合、
main.cpp内でcase文を使ってタイトル画面なりゲームオーバー画面なりを作ればいいのですか?
いかんせん初心者なもので、しかも分割コンパイルになっているので頭が混乱しています(苦笑)
雑な質問で恐縮なのですが、できるのであればどのようにしてできるのか、
プログラミングを教えて頂きたいです。
初心者の質問です
Re:初心者の質問です
こちらはご覧になりましたでしょうか?
これを元に作成してみてはいかがでしょうか。
33. 選択画面の作り方。
http://dixq.net/g/36.html
34. メイン関数の書き方。
http://dixq.net/g/37.html
これを元に作成してみてはいかがでしょうか。
33. 選択画面の作り方。
http://dixq.net/g/36.html
34. メイン関数の書き方。
http://dixq.net/g/37.html
Re:初心者の質問です
返信遅れて申し訳ありません。
解答ありがとうございます。
参考にさせて頂きながら只今作っているのですがもう一つ質問があります。
・タイトル画面 → ゲーム開始 → (ボス敵のHPを0にしたら)ゲームクリア画面 → タイトルに戻る
→ (自機HPが0になったら)ゲームオーバー画面
という単純なループをcase文を使って作ることには成功できました。
ただ、2週目をやろうとするとゲームクリアしていた場合はすぐにゲームクリア画面に、
ゲームオーバーしていた場合はすぐにゲームオーバー画面へ移行してしまいます。
おそらく2週目に行く際、ちゃんと初期化されていないからだと思うのですが・・・。
旧シューティングプログラムで作ってる場合、
ゲームクリアしている場合は、敵のHPをリセットすればいいと思います。
リセットする方法は単純にゲーム内カウンタを0にすればいいと思います。
自分のプログラムは12章に書いてある↓のプログラムのcase文内に、
Enemy.hp = 10;と設定し追加しているだけです。
/* enemy.cpp */
/* 素材 ver 1.10以上必要 */
#include "DxLib.h"
#include "ExternGV.h"
void EnemyPattern1(int i){
enemy.y+=1.5f;
}
void EnemyControl(){
for(int i=0;i<100;i++)
if(enemy.flag==1)
if(enemy.pattern==1)
EnemyPattern1(i);
}
void EnemyCalcDisp(){
int i;
for(i=0;i<100;i++)
if(enemy.flag==0)
break;
switch(counter){
case 100:
case 150:
case 200:
case 250:
enemy.flag=1; //出現フラグを立てる
enemy.counter=0;//出現して何カウント目か測るカウンター初期化
enemy.pattern=1; //どういう軌道を描くか
enemy.size=0.5f;//敵の大きさ
enemy.x=100.0; //xの初期座標
enemy[i].y=-10.0; //yの初期座標
break;
default:
break;
}
for(i=0;i<100;i++)
if(enemy[i].flag==1)
DrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[0] , TRUE ) ;
}
ゲームオーバーの場合、自機のHPはinitialization()関数内で設定しています。
ですからinitialization()関数をmain.cpp内で置く場所が間違っているのでしょうか。
でも、ほぼ旧シューティングプログラムの館通りに作っているので間違えてるはずはないと思うのですが・・・。
それともこのような考え方が間違っているのでしょうか?
もっと簡単に設定する方法があれば教えて頂きたいです。
解答ありがとうございます。
参考にさせて頂きながら只今作っているのですがもう一つ質問があります。
・タイトル画面 → ゲーム開始 → (ボス敵のHPを0にしたら)ゲームクリア画面 → タイトルに戻る
→ (自機HPが0になったら)ゲームオーバー画面
という単純なループをcase文を使って作ることには成功できました。
ただ、2週目をやろうとするとゲームクリアしていた場合はすぐにゲームクリア画面に、
ゲームオーバーしていた場合はすぐにゲームオーバー画面へ移行してしまいます。
おそらく2週目に行く際、ちゃんと初期化されていないからだと思うのですが・・・。
旧シューティングプログラムで作ってる場合、
ゲームクリアしている場合は、敵のHPをリセットすればいいと思います。
リセットする方法は単純にゲーム内カウンタを0にすればいいと思います。
自分のプログラムは12章に書いてある↓のプログラムのcase文内に、
Enemy.hp = 10;と設定し追加しているだけです。
/* enemy.cpp */
/* 素材 ver 1.10以上必要 */
#include "DxLib.h"
#include "ExternGV.h"
void EnemyPattern1(int i){
enemy.y+=1.5f;
}
void EnemyControl(){
for(int i=0;i<100;i++)
if(enemy.flag==1)
if(enemy.pattern==1)
EnemyPattern1(i);
}
void EnemyCalcDisp(){
int i;
for(i=0;i<100;i++)
if(enemy.flag==0)
break;
switch(counter){
case 100:
case 150:
case 200:
case 250:
enemy.flag=1; //出現フラグを立てる
enemy.counter=0;//出現して何カウント目か測るカウンター初期化
enemy.pattern=1; //どういう軌道を描くか
enemy.size=0.5f;//敵の大きさ
enemy.x=100.0; //xの初期座標
enemy[i].y=-10.0; //yの初期座標
break;
default:
break;
}
for(i=0;i<100;i++)
if(enemy[i].flag==1)
DrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[0] , TRUE ) ;
}
ゲームオーバーの場合、自機のHPはinitialization()関数内で設定しています。
ですからinitialization()関数をmain.cpp内で置く場所が間違っているのでしょうか。
でも、ほぼ旧シューティングプログラムの館通りに作っているので間違えてるはずはないと思うのですが・・・。
それともこのような考え方が間違っているのでしょうか?
もっと簡単に設定する方法があれば教えて頂きたいです。