シューティングゲームの館での疑問

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

シューティングゲームの館での疑問

#1

投稿記事 by situmon » 16年前

何回も読み返しているのですが疑問がかなり出てきて、
どうしても解決できないので聞きたいことがあります。
たくさんあるかもしれませんがよろしくお願いします。
ひとつは

http://dixq.net/s/17.html
for(j=0;j < ENEMY_TOTAL_NUM ;j++)//発射されていない弾を探す。
                        if(EnemyShot[j].flag==0)//あったらそこでiを保持してブレイク
                                break;
とはどういう意味ですか?
もうひとつは
#include "DxLib.h"
#include "Extern.h"
#include <math.h>
#define PI 3.1415926535897932384626433832795 
#define PI2 PI*2

void Enemy_shot_pat1(int i){

	for(int j=0;j<98;j++){
		if(e_shot.count==0){
		e_shot.bullet[j].flag=1;
		e_shot.bullet[j].x=e_shot.ex;
		e_shot.bullet[j].y=e_shot.ey;
		e_shot.bullet[j].angle=atan2(e_shot.py-e_shot.bullet[j].y,e_shot.px-e_shot[i].bullet[j].x)+PI2/98*j;
		e_shot[i].bullet[j].spd=2.0f;
		e_shot[i].bullet[j].img=3;
		e_shot[i].bullet[j].col=2;
        e_shot[i].bullet[j].turn=0;
        PlaySoundMem( sound_effect[2] , DX_PLAYTYPE_BACK ) ;
         }
	}
	for(int j=0;j<200;j++){
		e_shot[i].bullet[j].x+=e_shot[i].bullet[j].spd*cos(e_shot[i].bullet[j].angle);
		e_shot[i].bullet[j].y+=e_shot[i].bullet[j].spd*sin(e_shot[i].bullet[j].angle);
	}

}
void Enemy_shot_Control(){
	int i;
	for(i=0;i<Enemy_max;i++){
		if(e_shot[i].flag==1){
					if(e_shot[i].pat==1)
							 Enemy_shot_pat1(i);
*すいませんここはなにもないです。
		}
	}
}
void Enemy_shot_graph(){
for(int i=0;i<Enemy_max;i++){
		if(e_shot[i].flag==1){
			e_shot[i].count++;
			for(int j=0;j<Enemy_shot_max;j++){
				if(e_shot[i].bullet[j].flag==1){
					if(e_shot[i].bullet[j].turn==1)
	                     DrawRotaGraph( (int)e_shot[i].bullet[j].x , (int)e_shot[i].bullet[j].y , 1.0f , PI*((double)count*0.1) , enemy_shot_img[e_shot[i].bullet[j].img][e_shot[i].bullet[j].co[/url] , TRUE ) ;
					if(e_shot[i].bullet[j].turn==0){
                         e_shot[i].bullet[j].d_angle=e_shot[i].bullet[j].angle+PI/2;
	                     DrawRotaGraph( (int)e_shot[i].bullet[j].x , (int)e_shot[i].bullet[j].y , 1.0f , e_shot[i].bullet[j].d_angle ,enemy_shot_img[e_shot[i].bullet[j].img][e_shot[i].bullet[j].co[/url] , TRUE ) ;
					}
                           if(e_shot[i].bullet[j].x<-35 || e_shot[i].bullet[j].x>450 || e_shot[i].bullet[j].y<-50 || e_shot[i].bullet[j].y>480)
                                e_shot[i].bullet[j].flag=0;
				}
			}
		}
}
for(int i=0;i<Enemy_max;i++){
    if(e_shot[i].flag==1){
			for(int j=0;j<Enemy_shot_max;j++){
				if(e_shot[i].bullet[j].flag==1){
					return;
				}
			}
             e_shot[i].flag=0;
	}
}
}

で問題はないのでしょうか?
(EnemyShot[i].EnemyShots[j].はe_shot[i].bullet[j].にかわってます)
ほかにも変わっていますが。。。

かなりかえたのでこれでいいのか不安で・・・

ねこ

Re:シューティングゲームの館での疑問

#2

投稿記事 by ねこ » 16年前

・1個目
敵ショット配列を0からチェックしていき、flagが0(未使用)のものを探している

・2個目
何を持って「問題はない」と判断すれば良いのですか?
ただの変数の置き換えなら起動して動けばそれでいいと思います。
どう考えて、こう変えて、こう動いて欲しい。という内容がないと意図がよく分かりません。

situmon

Re:シューティングゲームの館での疑問

#3

投稿記事 by situmon » 16年前

enemy.cppは
#include "DxLib.h"
#include "Extern.h"

void Enemy_pat1(int i){
int j;
if(enemy.count<50)
enemy.y+=2.0f;
if(enemy.count>50 && enemy.count%10==0 ){
	for(j=0;j<Enemy_shotg_max;j++)
		if(e_shot[j].flag==0)
			break;
	e_shot[j].flag=1;
	e_shot[j].ex=enemy.x;
	e_shot[j].ey=enemy.y;
	e_shot[j].px=player.x;
	e_shot[j].py=player.y;
	e_shot[j].count=0;
	e_shot[j].pat=1;
}
}

void Enemy_Control(){
	int i;
	for(i=0;i<Enemy_max;i++){
		if(enemy.flag==1){
				if(enemy.pat==1)
					Enemy_pat1(i);
		}
	}
}
void Enemy_graph(){
	int i;
	for(i=0;i<Enemy_max;i++)
		if(enemy.flag==0)
			break;

	switch(count){
		case 50:
			enemy.pat=1;
			enemy[i].flag=1;
			enemy[i].count=0;
			enemy[i].img=1;
			enemy[i].x=200;
			enemy[i].y=-10;
			enemy[i].hp=500;
			break;
	}
for(i=0;i<Enemy_max;i++) {
	if(enemy[i].flag==1){
		enemy[i].count++;
	        DrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , 1.0f , 0.0f , enemy_img[enemy[i].img][count%12/2] , TRUE ) ;
			if(enemy[i].x<-35 || enemy[i].x>450 || enemy[i].y<-50 || enemy[i].y>480)
                enemy[i].flag=0;
}
}
	}

なのですが、
画面のように玉が途切れて、今まで表示されてたあたり判定の画像が表示されないのです。
ふつうif(enemy[i].count>50 && enemy[i].count%10==0 ){だから途切れることはないはずです。

#define Player_shot_max 5
#define Player_shot_max2 5
#define Player_shot_level 5
#define Enemy_max 30
#define Enemy_shotg_max 30
#define Enemy_shot_max 1000

です。

ねこ

Re:シューティングゲームの館での疑問

#4

投稿記事 by ねこ » 16年前

<ふつうif(enemy.count>50 && enemy.count%10==0 ){だから途切れることはないはずです
こっちは多分弾数制限かかってそう。
#define Enemy_shot_max 1000 ←を3000とかにしてもそうなるか確認して下さい。

<今まで表示されてたあたり判定の画像が表示されないのです。
何のですか?プレイヤー?もうちょっと主語を明確に。

situmon

Re:シューティングゲームの館での疑問

#5

投稿記事 by situmon » 16年前

えっと調べたらEnemy_shotg_maxの数だけしかリングを作ってくれないことがわかりました・・・
がどうすればいいのかがさっぱり・・・
当たり判定の画像は プレイヤーの当たり判定の画像です。

TRUTH

Re:シューティングゲームの館での疑問

#6

投稿記事 by TRUTH » 16年前

こんにちはー。

Enemy_shotg_maxの数も変更すれば大丈夫だと思います。
画像のリング状の一部が弾幕が欠けてるのは仕様ですか?

TRUTH

Re:シューティングゲームの館での疑問

#7

投稿記事 by TRUTH » 16年前

追記です。
シューティングゲームの館のほうは、ほとんど読んでいませんので
完全に把握しているわけではないのですが・・・


#define Enemy_shot_max 1000
だった場合にこの弾幕を実行すると、1000のうちの98しか
e_shotのbulletを使用していないという事はないでしょうか?
(弾幕1つにつき弾を1000発生成できるので最大で3万発は作れます)


Enemy_pat1(int i)で
if(enemy.count>50 && enemy.count%10==0 ){

	for(j=0;j<Enemy_shotg_max;j++)

		if(e_shot[j].flag==0)

			break;

	e_shot[j].flag=1;

	e_shot[j].ex=enemy.x;

	e_shot[j].ey=enemy.y;

	e_shot[j].px=player.x;

	e_shot[j].py=player.y;

	e_shot[j].count=0;

	e_shot[j].pat=1;

}

enemy.count%10==0として、「弾幕」にフラグを立てているわけですが
Enemy_shotg_max 30 ですので「弾幕」が消えるまではリング30個分しか登録できないはずです。

図にすると
弾幕1  弾98/1000使用中
弾幕2  弾98/1000使用中
  (略)
弾幕30 弾98/1000使用中
などのような状態になってると思うのですが・・・確かめてみてはどうでしょう?

situmon

Re:シューティングゲームの館での疑問

#8

投稿記事 by situmon » 16年前

>画像のリング状の一部が弾幕が欠けてるのは仕様ですか?
はい、あの隙間にもぐりこんで回るのをつくります!!
>enemy.count%10==0として、「弾幕」にフラグを立てているわけですが
>Enemy_shotg_max 30 ですので「弾幕」が消えるまではリング30個分しか登録できないはずです。
そうなのですか・・・
ではもっと増やします。

situmon

Re:シューティングゲームの館での疑問

#9

投稿記事 by situmon » 16年前

無事解決できました!
ありがとうございました。

閉鎖

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