ページ 11

弾の発射エフェクトの実装について

Posted: 2011年9月19日(月) 11:57
by クラバック
いつもお世話になっております。
弾が突然表示されるのに違和感を覚え、エフェクトをつけてから発射させたいと思っています。
過去のトピックに、Yperiaさんが投稿されたNO[49570]「 【画像処理?】東方のような発射処理」があり、まさにこれが私の実装したい内容です。
そこで、このトピックに従い、発射直後の20フレーム中に
アルファブレンド:0→255
大きさ:だいたい2.5倍→0.5倍
を、実装しようとしましたが、頭がこんがらがってコードに表せません。

私の現在の構想です。まず関数void graph_appear_bullet(double x, double y, int col)を実装します。
そして、例えばboss_shotH.cpp内で、その関数にx座標、y座標、色を渡し呼び出すと、
渡した座標に、渡した色のエフェクト(20フレームかけて、アルファブレンドアルファブレンド:0→255 、大きさ:だいたい2.5倍→0.5倍)が表示されるという方法です。
そして、関数graph_appear_bullet(double x, double y, int col)はgraph.cppに定義し、エフェクトの計算させるため、関数calc_appear_bullet()をcalc.cppに実装し・・・ようとしていますが、よく分からなくて右往左往しています。

弾の射出エフェクトの構造体appear_bullet_tを用意しました。
色は10色欲しかったので、define.hに射出エフェクト最大数としてAPPEAR_BULLET_MAX 10と宣言しています。
エフェクトの画像は、弾の画像ロードし、2.5倍から0.5倍に表示しようとしています。
宜しくお願い致します。

boss_shotH.cpp内

コード:

#include "../include/GV.h"
extern int search_boss_shot();
extern double bossatan2();
extern double shotatan2(double x,double y);
extern double shotatan3(double x1, double y1, double x2, double y2);
extern int move_boss_pos(double x1,double y1,double x2,double y2,double dist, int t);
extern void input_phy_pos(double x,double y,int t);
extern void graph_appear_bullet(double x, double y, int col);//射出エフェクト関数
graph.cpp内

コード:

#include "../include/GV.h"

extern void graph_back_main();
/*・・・*/
void graph_appear_bullet(double x, double y, int col){//弾の射出エフェクト関数
	for(int i=0;i<APPEAR_BULLET_MAX;i++){
		SetDrawBlendMode(DX_BLENDMODE_ALPHA, (int)(appear_bullet[i].brt));//0→255
		DrawRotaGraph(x, y,appear_bullet[i].scale,0,img_bullet[12][3],TRUE);//2.5倍~0.5倍
		SetDrawBlendMode(DX_BLENDMODE_NOBLEND,0);
}
/*・・・*/
void graph_main(){
	if(bright_set.brt!=255)SetDrawBright(bright_set.brt,bright_set.brt,bright_set.brt);

	graph_back_main();//背景描画メイン
	graph_effect(0);//敵が死ぬエフェクト

	if(bright_set.brt!=255)SetDrawBright(255,255,255);

	graph_effect(4);//喰らいボムのエフェクト

	if(bright_set.brt!=255)SetDrawBright(bright_set.brt,bright_set.brt,bright_set.brt);

	graph_boss();
	graph_enemy();//敵の描画
	graph_cshot();//自機ショットの描画

	if(bright_set.brt!=255)SetDrawBright(255,255,255);

	graph_ch();//自機の描画

	if(bright_set.brt!=255)SetDrawBright(bright_set.brt,bright_set.brt,bright_set.brt);
	
	graph_bullet();//弾の描画

	if(bright_set.brt!=255)SetDrawBright(255,255,255);

	graph_effect(1);//ボムのエフェクト
	graph_effect(2);//ボム線のエフェクト
	graph_effect(3);//ボムキャラのエフェクト
	graph_board();//ボードの描画

	graph_develop();

	void graph_appear_bullet(double x, double y, int col);//弾の射出エフェクト関数
}
calc.cpp内

コード:

#include "../include/GV.h"

void calc_appear_bullet(){
	for(int i=0;i<APPEAR_BULLET_MAX;i++){
		if(appear_bullet[i].flag>0){
			if(appear_bullet[i].cnt<appear_bullet[i].to_cnt){
				appear_bullet[i].brt -= 255/appear_bullet[i].to_cnt;
				appear_bullet[i].scale -= 0.1;
			}
		}
	}
}
void calc_main(){
	void calc_appear_bullet();
}
load.cpp内

コード:

#include "../include/GV.h"
void load(){
/*・・・*/
LoadDivGraph( "../dat/img/bullet/b15.png" , 10, 10, 1, 25, 26, img_bullet[12] );
}
define.h内

コード:

/*・・・*/
//弾の射出エフェクト最大数
#define APPEAR_BULLET_MAX 10
GV.h内

コード:

#include "../../../include/DxLib.h"
#include "define.h"
#include "math.h"

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif

#include "function.h"
/*・・・*/
//構造体変数宣言部
GLOBAL appear_bullet_t appear_bullet[APPEAR_BULLET_MAX];//弾の射出エフェクトの構造体
struct.h内

コード:

/*・・・*/
//弾の出現エフェクトの情報
typedef struct{
	int flag,cnt,col,to_cnt;
	double brt,scale;
}appear_bullet_t;

Re: 弾の発射エフェクトの実装について

Posted: 2011年9月20日(火) 12:05
by Tatu
発射する弾の画像を
拡大、αブレンドを使って、
発射する直前に表示するというものなら
弾発射エフェクト用の構造体を用意しなくても
弾構造体を利用すればできます。

弾発射処理の時にcntにマイナスの値を代入しておき、
cntが-20以下なら何も描画しない。
cntが-20から0の間にあるとき、発射エフェクトを描画し、
cntが0以上ならそれまで通りに弾の計算、描画を行うというようにしたらどうでしょうか?

このやりかたについては日記にまとめたのでこちらを参考にしてみてください。
http://dixq.net/forum/blog.php?u=525&b=2353

丸いエフェクトを使うやり方については
エフェクトと弾の色を合わせるのが面倒そうなので
手を付けていません。

Re: 弾の発射エフェクトの実装について

Posted: 2011年9月21日(水) 12:56
by クラバック
無事実装できました!有り難うございます。
確かにこの方法だと、弾を生成するときに一緒に指定できて、関数を呼ばずに済むので楽ですね。