敵の消滅時エフェクト表示について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
aaa
記事: 6
登録日時: 10年前
住所: 青森県

敵の消滅時エフェクト表示について

#1

投稿記事 by aaa » 10年前

プログラミング初心者のものですがSTG製作をしています。
それで、敵の消滅時にエフェクトを表示させたいと思ったのですがどうやってもうまく表示されません。
コードは下の通りです。

コード:

/*敵と自弾の当たり判定*/
void ECollisionDetection() {
	for (int i = 0; i<PLAYER_MAX_SHOT1; i++) {//ショットの全列分(1列分)
		for (int j = 0; j<PLAYER_MAX_SHOT2; j++) {//1列j弾分
			if (PlayerShot[i][j].flag == 1) {//その弾が発射中なら
				for (int s = 0; s < ENEMY_TOTAL_NUM; s++) {//全敵100体分ループ
					if (enemy[s].flag == 1) {//その敵が出現中なら
						double x, y;
						int range;
						x = (int)(PlayerShot[i][j].x - enemy[s].x);//player-enemy x,y長さ
						y = (int)(PlayerShot[i][j].y - enemy[s].y);
						switch (i) {//iはショットの列
						case 0:
							range = 12;//自弾の半径の大きさ12
							break;
						}
						if ((int)sqrt(x*x + y*y) < range + enemy[s].range) {//当たったなら
								enemy[s].flag = 0;//敵の消滅
								EnemyShot[s].flag = 0;
								PlayerShot[i][j].flag = 0;//自弾の消滅
								if (CheckSoundMem(sound_enemy_death) == 1)//敵の消滅音鳴らす
									StopSoundMem(sound_enemy_death);
								PlaySoundMem(sound_enemy_death, DX_PLAYTYPE_BACK);
						}
					}
				}
			}
		}
	}
}

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 敵の消滅時エフェクト表示について

#2

投稿記事 by usao » 10年前

>エフェクトを表示
のための処理はどれなのでしょう?

あと,rangeが不安.値が定まらない場合がありそうです.(i≠0のとき)

aaa
記事: 6
登録日時: 10年前
住所: 青森県

Re: 敵の消滅時エフェクト表示について

#3

投稿記事 by aaa » 10年前

下のコードがエフェクト表示のためのコードです。
フラグは敵と自弾が当たった時に立つように書き換えたのですがうまくいきません

コード:

/*effect*/
void effect(){
	for (int i = 0; i < ENEMY_TOTAL_NUM; i++) {
		eff.x = enemy[i].x;
		eff.y = enemy[i].y;
	}
	if (eff.flag == 1) {
		eff.con++;
		SetDrawBlendMode(DX_BLENDMODE_ALPHA, 128);
		DrawRotaGraph((int)eff.x, (int)eff.y, 0.0f, 0.0f, eff_ect, TRUE);
		SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);

		if (eff.con < 600)
			eff.flag = 0;
	}
}

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 敵の消滅時エフェクト表示について

#4

投稿記事 by usao » 10年前

line3~6 の

> for (int i = 0; i < ENEMY_TOTAL_NUM; i++) {
> eff.x = enemy.x;
> eff.y = enemy.y;
> }

これは
eff.x = enemy[ ENEMU_TOTAL_NUM - 1 ].x;
eff.y = enemy[ ENEMU_TOTAL_NUM - 1 ].y;
と書いたのと結果として同じことになりそうに思いますが,この処理の意図がわかりません.

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 敵の消滅時エフェクト表示について

#5

投稿記事 by みけCAT » 10年前

aaa さんが書きました:フラグは敵と自弾が当たった時に立つように書き換えたのですがうまくいきません
この部分のコードを見せてください。
少なくとも、No: 1のコードでは全くeffに触れていないですよね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

aaa
記事: 6
登録日時: 10年前
住所: 青森県

Re: 敵の消滅時エフェクト表示について

#6

投稿記事 by aaa » 10年前

このように当たり判定後にエフェクトの描画フラグを立てるようにしました

コード:

/*敵と自弾の当たり判定*/
void ECollisionDetection() {
	for (int i = 0; i<PLAYER_MAX_SHOT1; i++) {//ショットの全列分(1列分)
		for (int j = 0; j<PLAYER_MAX_SHOT2; j++) {//1列j弾分
			if (PlayerShot[i][j].flag == 1) {//その弾が発射中なら
				for (int s = 0; s < ENEMY_TOTAL_NUM; s++) {//全敵100体分ループ
					if (enemy[s].flag == 1) {//その敵が出現中なら
						double x, y;
						int range;
						x = (int)(PlayerShot[i][j].x - enemy[s].x);//player-enemy x,y長さ
						y = (int)(PlayerShot[i][j].y - enemy[s].y);
						switch (i) {//iはショットの列
						case 0:
							range = 12;//自弾の半径の大きさ12
							break;
						}
						if ((int)sqrt(x*x + y*y) < range + enemy[s].range) {//当たったなら
								enemy[s].flag = 0;//敵の消滅

								eff.flag = 1;

								EnemyShot[s].flag = 0;
								PlayerShot[i][j].flag = 0;//自弾の消滅
								if (CheckSoundMem(sound_enemy_death) == 1)//敵の消滅音鳴らす
									StopSoundMem(sound_enemy_death);
								PlaySoundMem(sound_enemy_death, DX_PLAYTYPE_BACK);
						}
					}
				}
			}
		}
	}
}

aaa
記事: 6
登録日時: 10年前
住所: 青森県

Re: 敵の消滅時エフェクト表示について

#7

投稿記事 by aaa » 10年前

for (int i = 0; i < ENEMY_TOTAL_NUM; i++) {
> eff.x = enemy.x;
> eff.y = enemy.y;
> }
このように書いたのに特に意図があったわけではありません。
usaoさんの言う通りそっちのコードでもおなじですね。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 敵の消滅時エフェクト表示について

#8

投稿記事 by みけCAT » 10年前

aaa さんが書きました:

コード:

		if (eff.con < 600)
			eff.flag = 0;
この部分も怪しいですね。
eff.conはインクリメントされているので、例えば0に初期化されているのであればすぐにフラグが折れてしまいます。
オーバーフロー(符号付き整数ならば未定義動作)で小さい数にする、という処理の流れも不自然でしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 敵の消滅時エフェクト表示について

#9

投稿記事 by みけCAT » 10年前

そもそも、エフェクトの表示開始(させたい)時にきちんとeffの必要なパラメータを初期化していますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

aaa
記事: 6
登録日時: 10年前
住所: 青森県

Re: 敵の消滅時エフェクト表示について

#10

投稿記事 by aaa » 10年前

コードの7行目の後に
eff.x=enemy.x;
eff.y=enemy.y;
という風に初期化したのですが表示されません

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 敵の消滅時エフェクト表示について

#11

投稿記事 by みけCAT » 10年前

aaa さんが書きました:コードの7行目の後に
eff.x=enemy.x;
eff.y=enemy.y;
という風に初期化したのですが表示されません

どのコードですか?
eff.conは初期化しましたか?
No: 8で指摘した部分は適切な仕様ですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

aaa
記事: 6
登録日時: 10年前
住所: 青森県

Re: 敵の消滅時エフェクト表示について

#12

投稿記事 by aaa » 10年前

当たり判定のコードで初期化しました
今はflagを戻す処理は無視してまずは表示だけ行っています

流れのプログラマ

Re: 敵の消滅時エフェクト表示について

#13

投稿記事 by 流れのプログラマ » 10年前

あの、横から失礼しますが、現状から無理に爆発を表示させたとして、根本的な解決にはならないような気が。
今回必要なことは「複数同士の当たり判定と状態遷移の管理」なので、まずは「単体同士の状態遷移の管理」を理解する必要があるでしょう。

質問者さんは
「一つの弾と一つの敵との当たり判定を取って、当たったら爆発する」
これはちゃんとクリアできましたか?
できてるなら、次に「一つの弾と一つの敵との当たり判定」を「不特定の一つの弾と不特定の一つの敵との当たり判定」として関数化してみてください。
同じように、「特定位置の爆発」を関数化して「不特定位置の爆発」にしてみてください。

閉鎖

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