ページ 1 / 1
敵の消滅時エフェクト表示について
Posted: 2015年9月28日(月) 11:27
by aaa
プログラミング初心者のものですが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);
}
}
}
}
}
}
}
Re: 敵の消滅時エフェクト表示について
Posted: 2015年9月28日(月) 11:56
by usao
>エフェクトを表示
のための処理はどれなのでしょう?
あと,rangeが不安.値が定まらない場合がありそうです.(i≠0のとき)
Re: 敵の消滅時エフェクト表示について
Posted: 2015年9月28日(月) 12:12
by aaa
下のコードがエフェクト表示のためのコードです。
フラグは敵と自弾が当たった時に立つように書き換えたのですがうまくいきません
コード:
/*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;
}
}
Re: 敵の消滅時エフェクト表示について
Posted: 2015年9月28日(月) 12:26
by usao
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;
と書いたのと結果として同じことになりそうに思いますが,この処理の意図がわかりません.
Re: 敵の消滅時エフェクト表示について
Posted: 2015年9月28日(月) 12:28
by みけCAT
aaa さんが書きました:フラグは敵と自弾が当たった時に立つように書き換えたのですがうまくいきません
この部分のコードを見せてください。
少なくとも、No: 1のコードでは全くeffに触れていないですよね。
Re: 敵の消滅時エフェクト表示について
Posted: 2015年9月28日(月) 12:34
by aaa
このように当たり判定後にエフェクトの描画フラグを立てるようにしました
コード:
/*敵と自弾の当たり判定*/
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);
}
}
}
}
}
}
}
Re: 敵の消滅時エフェクト表示について
Posted: 2015年9月28日(月) 12:38
by aaa
for (int i = 0; i < ENEMY_TOTAL_NUM; i++) {
> eff.x = enemy.x;
> eff.y = enemy.y;
> }
このように書いたのに特に意図があったわけではありません。
usaoさんの言う通りそっちのコードでもおなじですね。
Re: 敵の消滅時エフェクト表示について
Posted: 2015年9月28日(月) 12:43
by みけCAT
aaa さんが書きました:コード:
if (eff.con < 600)
eff.flag = 0;
この部分も怪しいですね。
eff.conはインクリメントされているので、例えば0に初期化されているのであればすぐにフラグが折れてしまいます。
オーバーフロー(符号付き整数ならば未定義動作)で小さい数にする、という処理の流れも不自然でしょう。
Re: 敵の消滅時エフェクト表示について
Posted: 2015年9月28日(月) 12:44
by みけCAT
そもそも、エフェクトの表示開始(させたい)時にきちんとeffの必要なパラメータを初期化していますか?
Re: 敵の消滅時エフェクト表示について
Posted: 2015年9月28日(月) 12:54
by aaa
コードの7行目の後に
eff.x=enemy.x;
eff.y=enemy.y;
という風に初期化したのですが表示されません
Re: 敵の消滅時エフェクト表示について
Posted: 2015年9月28日(月) 13:00
by みけCAT
aaa さんが書きました:コードの7行目の後に
eff.x=enemy.x;
eff.y=enemy.y;
という風に初期化したのですが表示されません
どのコードですか?
eff.conは初期化しましたか?
No: 8で指摘した部分は適切な仕様ですか?
Re: 敵の消滅時エフェクト表示について
Posted: 2015年9月28日(月) 13:04
by aaa
当たり判定のコードで初期化しました
今はflagを戻す処理は無視してまずは表示だけ行っています
Re: 敵の消滅時エフェクト表示について
Posted: 2015年9月28日(月) 14:30
by 流れのプログラマ
あの、横から失礼しますが、現状から無理に爆発を表示させたとして、根本的な解決にはならないような気が。
今回必要なことは「複数同士の当たり判定と状態遷移の管理」なので、まずは「単体同士の状態遷移の管理」を理解する必要があるでしょう。
質問者さんは
「一つの弾と一つの敵との当たり判定を取って、当たったら爆発する」
これはちゃんとクリアできましたか?
できてるなら、次に「一つの弾と一つの敵との当たり判定」を「不特定の一つの弾と不特定の一つの敵との当たり判定」として関数化してみてください。
同じように、「特定位置の爆発」を関数化して「不特定位置の爆発」にしてみてください。