弾発射エフェクト

アバター
Tatu
記事: 445
登録日時: 14年前
住所: 北海道

弾発射エフェクト

投稿記事 by Tatu » 14年前

龍神録プログラミングの館のプログラムに
弾発射エフェクトを付けることを考えます。

以下に示すような単純なものなので
敵消滅エフェクトやボムエフェクトのような
エフェクト制御構造体とエフェクト構造体による実装ではなく、
弾構造体を使って実装します。
弾構造体の示す情報が弾発射エフェクトから弾に変わるという感じです。

弾発射エフェクトの仕様は次のようにしました。
発射される弾のカウント変数が-20から0の間にあるとき、
その弾の画像をαブレンドと拡大を使って表示します。
カウント変数が-20以下の時は計算も描画もしない。
カウント変数が-20から0の間の時は計算はせず、描画のみ行う。
アルファ値は0から255、大きさは2から1の間で変化させる。
カウント変数が0以上の時はそれまで通り。

以下、変更内容
ただし、前に改造したものから変更したため、
弾の大きさを制御するboss_shot.bullet[j].sizeという変数が入っていたりしますが
そういった処理がない場合、boss_shot.bullet[j].sizeは1に置き換えてください。

弾の計算の変更
cntが負ならば動かないようにします。
boss_shot.cpp
boss_shot_calc()の以下を変更

CODE:

	for(i=0;i0){
			if(boss_shot.bullet[i].cnt>=0){
				boss_shot.bullet[i].x+=cos(boss_shot.bullet[i].angle)*boss_shot.bullet[i].spd;
				boss_shot.bullet[i].y+=sin(boss_shot.bullet[i].angle)*boss_shot.bullet[i].spd;
			}
			boss_shot.bullet[i].cnt++;
			if(boss_shot.bullet[i].cnt>boss_shot.bullet[i].till){
				if(boss_shot.bullet[i].xFMX+50 ||
					boss_shot.bullet[i].yFMY+50)
					boss_shot.bullet[i].flag=0;
			}
		}
	}
弾の当たり判定はもともとcntが正でないとおこなわないので変更は不要です。

弾の描画処理の変更
弾発射エフェクトの処理を追加し、
弾発射エフェクトよりも前ならば何も描画しないようにします。

graph.cppのgraph_bulletの以下を変更

CODE:

	//ボス
	if(boss_shot.flag>0){//弾幕データがオンなら
		for(j=0;j=-20){
					SetDrawBlendMode(DX_BLENDMODE_ALPHA,255+255*boss_shot.bullet[j].cnt/20);
					DrawRotaGraphFdF(boss_shot.bullet[j].x,boss_shot.bullet[j].y,
						boss_shot.bullet[j].size*(1.0-boss_shot.bullet[j].cnt/20.0),
						boss_shot.bullet[j].angle+PI/2,
						img_bullet[boss_shot.bullet[j].knd][boss_shot.bullet[j].col],
						TRUE,0);
					SetDrawBlendMode(DX_BLENDMODE_ALPHA,255);
				}
				else if(boss_shot.bullet[j].cnt>=0){
					eff=0;
					if(boss_shot.bullet[j].kaiten==1)
						disp_angle=PI2*(boss_shot.bullet[j].cnt%120)/120;
					else
						disp_angle=boss_shot.bullet[j].angle+PI/2;
					if(boss_shot.bullet[j].eff_detail==1){//風雨にも負けず用弾エフェクト
						SetDrawBlendMode( DX_BLENDMODE_ADD, 100+GetRand(155)),eff=1 ;
						DrawRotaGraphFdF(
							boss_shot.bullet[j].x, boss_shot.bullet[j].y,
							1.3, disp_angle,
							img_bullet[boss_shot.bullet[j].knd][boss_shot.bullet[j].col],TRUE);
					}
					if(boss_shot.bullet[j].eff==1)
						SetDrawBlendMode( DX_BLENDMODE_ADD, 255),eff=1 ;
					if(boss_shot.bullet[j].eff==2)
						SetDrawBlendMode( DX_BLENDMODE_ADD, 255-GetRand(100)),eff=1 ;
					DrawRotaGraphFdF(
						boss_shot.bullet[j].x, boss_shot.bullet[j].y,
						boss_shot.bullet[j].size, disp_angle,
						img_bullet[boss_shot.bullet[j].knd][boss_shot.bullet[j].col],TRUE);
					if(eff==1)
						SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0) ;
				}
			}
		}
	}
	SetDrawMode(DX_DRAWMODE_NEAREST);//描画形式を戻す
}
おまけのサンプル動画
[nico]http://www.nicovideo.jp/watch/sm15654239[/nico]
弾幕関数は

CODE:

void boss_shot_bulletE236(){
	if(boss_shot.cnt%3==0){
		for(int i=0;i<6;i++){
			const int R=150;
			double angle=boss_shot.cnt*PI2*3/92+PI2/6*i;
			double x=R*cos(angle);
			double y=R*sin(angle);
			boss_bullet_on3(2,1,1,i,1,-20,boss.x+x,boss.y+y,angle,PI,2,0,0,0,0,0,1);
		}
	}
}
弾発射時にcntが-20になるようにしています。

アバター
SAI
記事: 115
登録日時: 14年前

Re: 弾発射エフェクト

投稿記事 by SAI » 14年前

丸い弾や光る弾ならそれでいいと思うのですが、お札弾やナイフ弾などは変になりませんか?
あーそこは感じ方の問題かもしれませんねw

アバター
クラバック
記事: 26
登録日時: 14年前

Re: 弾発射エフェクト

投稿記事 by クラバック » 14年前

有難うございます。ひとまず教えて頂いた処理を紐解いてみます。