STGについてその①(ステージ編)

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

STGについてその①(ステージ編)

#1

投稿記事 by 華穂 » 16年前

やっぱり駄目でした。
どうにもさっぱり分からなくなってしまい、書き込みさせていただきます。

題名の『STG(シューティングゲーム)についてその①』というのは、これからもうしばらく先は
課題のSTGの分からないところを書いていこうと思い、このような題名をとらせていただきました。

では、まずソースを。(非常に長いです)

//ステージ全部の雑魚敵総数
#define TZ_ALL 132
//グローバル
int Stage = 0;

struct E_Zako
{
	//変数設定
	//波・特攻それぞれ配列を設定
	double EZakoX, EZakoY;
	int BotuEZako, EZBreak;
	int EZakoW, EZakoH;
	int EZSpeed;
	int EZCounter;
	int EZLife;
   	int TEZ_Set;
	int EZakoFlag;
	int EZakoType;
	int EZCome;
	float EZT,EZH,EZY;		
	//自機から見た角度
   	double Target_angle;	
	//自機	
	int Ziki[2], ZikiX, ZikiY;	
	//ステージ
	int Stage;
};

class C_EZako
{   
	//全ステージ5・雑魚敵の総数50機                                         
	E_Zako EZ[TZ_AL[/url];
	EZ_C ez_c[5];

☆自機と弾の変数をこちらに設置	

public:

C_EZako();
void EZ_move();
void EZ_Atari();
void EZ_HP(int i, int damage);
void TokAngSet(int i,double ang);
void EZ_TASet(int i);
	
//リターンの値を設定
int EZ_X(int i){return EZ.EZakoX;}     //x座標を返す
int EZ_Y(int i){return EZ.EZakoY;}
int EZ_AS(int i){return EZ.TEZ_Set;}
int EZ_Type(int i){return EZ.EZakoType;}
};

///初期化
C_EZako::C_EZako()
{

EZako = LoadGraph("EZako.bmp");
TEZako = LoadGraph("EZako.bmp");
for(int i = 0; i < 5; ++i){
ez_c.nami = 0;
ez_c.tokkou = 0;
}
	
//初期化
for(int i = 0; i < TZ_ALL; ++i)
{
	
for(;;){
int a = rand()%2;
	
int br = 0;
	
if(i < 8){
EZ.Stage = 0;    
//敵のライフ
EZ.EZLife = 1;
	   
if(a == 0){//波
if(ez_c[0].nami < 5){
EZ.EZakoType = 0;
ez_c[0].nami += 1;
}		
else{
 br = 1;//breakのことです
}		
}
else if(a == 1){//特攻
if(ez_c[0].tokkou < 3){
EZ.EZakoType = 1;
ez_c[0].tokkou += 1;
//br = 0;
}		
else{
br = 1;
}
}   
		   
}
else if(i < 8 + 14){
 EZ[i].Stage = 1;    
//敵のライフ
EZ[i].EZLife = 2;
		   
 if(a == 0){//波
if(ez_c[1].nami < 10){
EZ[i].EZakoType = 0;
ez_c[1].nami += 1;
}		
else{
br = 1;
}		
}

 else if(a == 1){//特攻
if(ez_c[1].tokkou < 4){
EZ[i].EZakoType = 1;
ez_c[1].tokkou += 1;
//br = 0;
}		
else{
br = 1;
}
}
}
else if(i < 8 + 14 + 20){
EZ[i].Stage = 2;     
//敵のライフ
EZ[i].EZLife = 3;
		   



以下次のところに書きます。

華穂

Re:STGについてその①(ステージ編)

#2

投稿記事 by 華穂 » 16年前

if(a == 0){//波
if(ez_c[2].nami < 15){
EZ.EZakoType = 0;
ez_c[2].nami += 1;
}		
else{
br = 1;
}		
}
 else if(a == 1){//特攻
if(ez_c[2].tokkou < 5){
EZ.EZakoType = 1;
ez_c[2].tokkou += 1;
//br = 0;
}		
else{
 br = 1;
}
}
		   
}
else if(i < 8 + 14 + 20 + 40){
 EZ.Stage = 3;    
//敵のライフ
EZ.EZLife = 3;
		   
if(a == 0){//波
if(ez_c[3].nami < 30){
EZ.EZakoType = 0;
ez_c[3].nami += 1;
}		
else{
br = 1;
}		
}
else if(a == 1){//特攻
if(ez_c[3].tokkou < 10){
EZ.EZakoType = 1;
ez_c[3].tokkou += 1;
//br = 0;
}		
else{
br = 1;
}
}
		   
}
else if(i < 8 + 14 + 20 + 40 + 50){
EZ.Stage = 4;   
//敵のライフ
EZ.EZLife = 3;

 if(a == 0){//波
if(ez_c[4].nami < 35){
EZ.EZakoType = 0;
ez_c[4].nami += 1;
}		
else{
br = 1;
}		
}
 else if(a == 1){//特攻
if(ez_c[4].tokkou < 15){
EZ.EZakoType = 1;
ez_c[4].tokkou += 1;
//br = 0;
}		
else{
br = 1;
}
}
		   
}
		
if(br == 0)break;	
		
}
ここから先は波と特攻の動きを表すソースのため
略します。(長すぎて入りきれませんでした
知りたいという方がいらっしゃったらおっしゃってください
ひとつ下に記します。また、適当に区切ったために
『}』が足りなかったり多かったりしますが今は無視して
くださってください。)
}
}



以上、長くなりましたが、これが雑魚敵のクラスです。
前にも何度か漏らしたことがあるとはおもいますが、ソースコードの中の


//初期化
for(int i = 0; i < TZ_ALL; ++i)
{

for(;;){



から始まるそれぞれの敵とステージの振り分け・・お分かりでしょうか?
実は、今これに大変困っております。

というのもこれのシューティングゲーム、ステージごとに最初に敵が現れる
数を決めなければならないからです。

ステージ1なら、4体。これ以降、4体・5体・5体・6体

とこれらの数だけ敵が最初に出てきます。
こいつらを1体やっつけることで、敵が1体増えるという処理を、
ここでステージごとにかかなければならないのですが・・。
これに困っているのです。

というもの・・これ、お分かりでしょうが、2パターンともひとつずつの
関数?から出しています。
つまり、これおそらく書いたらめちゃくちゃになると思うんですよね。

それを避けたいんですが、考えが浮かびません。

先輩から上部につくったグローバル関数(Stage)を利用しうんたら~と
われたのですが、ピンとこず。

ごめんなさい。
こればっかりはどうやって作ればいいのかわかりません。(涙目)
書き変えて変になったら怖いし・・。
最初は乱数で特攻・波敵を合計で4体出そうと思いましたが、無理でした。
なので、ほどよい数字・・たとえば、最初に波2・特攻2を出すなど乱数を使わない、
まだ簡単なソースでもいいので、今の状況の上記の示したソースの場所をどうやったらうまく
変えて、困っている問題を解決することができるか教えてください。

今の状況(ソース)だと、別のところでとあるキーを押すとステージを、敵を倒さずとばすようにしています。(倒す前に敵が右端からどんどん流れてくる状況です)
それもはずしてうまくしなければなりませんが、ここで詰まりに詰まっているため、ぜひともこればっかりは、実際のソースコードなどを書いて教えてほしいです。

難問な問題を押しつけて申し訳ありません。
ですが、ぜひとも今回はソースを書いて簡単な説明をください。。

どうぞ、よろしくお願いします。





というかすみません。
上レスで途中区切ったために
の相方がこちらの方で書きこまれて、
上記がみにくくなってしまいました。

きれいなやつが見たいという人はぜひおっしゃってください。
もう一度記します。

array

Re:STGについてその①(ステージ編)

#3

投稿記事 by array » 16年前

前回の投稿でも注意されていましたが、利用規約に書いてある事は守ったほうがいいと思います。
http://dixq.net/board/board.html

間違わないコツとしては投稿を押す前にプレビューにチェックを入れてから投稿すると、すぐに投稿されず一旦どの様な形で表示されるのか確認することが出来るので活用すると間違いがなくなると思います。

華穂

Re:STGについてその①(ステージ編)

#4

投稿記事 by 華穂 » 16年前

なるほど・・プレビューの活用方法がありましたか。
確かに、気づいたときには既に遅く・・とあり、
申しわけなかったでし。

次回からはもっと細心の注意を払っていきたいと思います。
array様、ご指定ありがとうございました。

ねこ

Re:STGについてその①(ステージ編)

#5

投稿記事 by ねこ » 16年前

質問内容の前に敵データの管理設計から考え直した方が良いんじゃない?
二次元配列やステージ単位の敵数情報構造体なりを用意した方がループ処理も出来るし楽だと思うよ。
全部一次元配列に格納しているから頭がごっちゃになっているんじゃないかな。

それから質問内容は敵の初期データ設定だけでメインループや敵倒した時の処理も全く無いから
ソース込みでの返信は誰も出来ないと思う。

<Pre
前も書いただけど修正でも良いんだから、ってもしかして修正方法が分からないのかな。
投稿ボタンの右の削除キーというところにパスワードを入れておくと、記事の右上の「編集」から記事内容を修正する事が出来るよ。
Preタグ抜けも修正出来るのでちゃんと削除キーを指定して投稿する事推奨。

華穂

Re:STGについてその①(ステージ編)

#6

投稿記事 by 華穂 » 16年前

返信が遅くなってしまって申し訳ありませんっ!!

確かに、二次元配列を使ったほうが楽かもしれませんね。
少し頭を整理して書き直してみたいと思います!


ねこ様、的確なアドバイス、ありがとうございました!

閉鎖

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