画像(logo)

HOME/[C言語DXライブラリ]STGの作り方 目次/九日目 爆発エフェクト

広告

[C言語 DXライブラリ STGの作り方]
九日目 爆発エフェクト

広告

↓2016年02月29日発売↓

12歳からはじめる ゼロからのC言語 ゲームプログラミング教室

目次へ戻る

爆発エフェクト

今回は爆発エフェクトを作りたいと思います。

とてもささやかなものなので期待はしないでください。

では爆発エフェクトの構造体から見てみましょう。

#define EXP_EFFECT_MAX 20

struct EXP_EFFECT{
	double first_x;
	double first_y;
	double x;
	double y;
	double draw_x;
	double draw_y;
	int init_flag;
	int move_flag;
	int move_type;
	int gamecount_point;
};

struct EXP_EFFECT exp_effect[EXP_EFFECT_MAX];

今まで見たショットや敵の構造体なんかとよく似ていますね。

座標やら初期化用フラグやら・・・。

そうなんです、爆発エフェクトを作る時も何か特別な事をするワケではなく今まで通り爆発という行動をする構造体を作るだけなのです。

構造体作って初期化して「move_flag」をセットする関数作って動かしてなどなどほとんど同じなのでさらっといきたいと思います。

初期化

初期化します。

void my_init_exp_effect(){
	for (int i = 0; i < EXP_EFFECT_MAX; i++){
		exp_effect[i].first_x = 0;
		exp_effect[i].first_y = 0;
		exp_effect[i].x = 0;
		exp_effect[i].y = 0;
		exp_effect[i].draw_x = 0;
		exp_effect[i].draw_y = 0;
		exp_effect[i].init_flag = 0;
		exp_effect[i].move_flag = 0;
		exp_effect[i].move_type = 0;
		exp_effect[i].gamecount_point = 0;
	}
}

全て「0」で初期化しているだけです。

爆発エフェクトの流れ

爆発エフェクトの流れを見てみましょう。

1・敵が消滅する時に爆発エフェクト起動!!

2・爆発エフェクトが起動されたら現在未使用の「爆発エフェクトの入れ物」を調べて使用中に

3・その時の「爆発エフェクトの動き方」などを「爆発エフェクトの入れ物」に登録

4・その「爆発エフェクトの動き方」に応じて出現・計算・表示

5・終わったら再び「爆発エフェクトの入れ物」を未使用に

最初の部分以外やはりほとんど変わらないですね!

では爆発エフェクトを起動するトコロから見ていきましょう。

爆発エフェクト起動

敵の体力が「0」になり死亡した際の爆発エフェクト起動部分を見てみます。

void my_check_enemy_power(){
	for(int i = 0;i < DISP_ENEMY_MAX;i++){
		if(enemy[i].move_flag == 1 && enemy[i].init_flag == 1){
			if(enemy[i].power <= 0){
				enemy[i].move_flag = 0;
				enemy[i].init_flag = 0;
				my_set_exp_effect(enemy[i].x,enemy[i].y,1);
			}
		}	
	}
}

敵の残り体力を調べる「my_check_enemy_power()」です。

後半部分に注目です。

if(enemy[i].power <= 0){
	enemy[i].move_flag = 0;
	enemy[i].init_flag = 0;
	my_set_exp_effect(enemy[i].x,enemy[i].y,1);
}	

「my_set_exp_effect()」こちらが爆発エフェクトを起動する関数になります。

my_set_exp_effect(enemy[i].x,enemy[i].y,1);

その時の敵のx座標・y座標、そして爆発エフェクトの種類を表す値を渡して爆発エフェクト起動です!

ちなみに今のトコロ爆発エフェクト0番が「敵に弾が当たってまだ死なない時」で爆発エフェクト1番が「敵に弾が当たって死亡した時」のエフェクトになっております。

では「my_set_exp_effect()」の中身を見てみましょう。

void my_set_exp_effect(double x,double y,int exp_type){
	for(int i = 0;i < EXP_EFFECT_MAX;i++){
		if(exp_effect[i].move_flag == 0){
			exp_effect[i].move_flag = 1;
			exp_effect[i].first_x = x;
			exp_effect[i].first_y = y;
			exp_effect[i].move_type = exp_type;
			break;
		}
	}
}

同じように「exp_effect[i].move_flag == 0」の敵を探して座標と動き方を登録しているだけですね!

では実際の動きを見てみましょう。

「爆発エフェクトの動き方」に応じて出現・計算

爆発エフェクトの動き方を計算する「my_move_exp_effect()」です。

少し長いので分けて説明します。

まずは全ての「爆発エフェクトの入れ物」を調べてそれが使用中かどうか調べます。

for(int i = 0;i < EXP_EFFECT_MAX;i++){
	if(exp_effect[i].move_flag == 1){
	}
}

ここで使用中「exp_effect[i].move_flag == 1」の状態のものがあった場合、その爆発エフェクトは動いていなきゃいけないので動かします。

「switch」文で動き方を振り分けます。

switch (exp_effect[i].move_type){
case 0:
	/*爆発エフェクト1*/
	break;
case 1:
	/*爆発エフェクト2*/
	break;
default:
	break;
}

今回は「case 1」敵が死亡して消滅する時の爆発エフェクトの動きを説明します。

初期化部分と移動部分に分かれます。

初期化部分を見てみます。

if (exp_effect[i].init_flag == 0){
	exp_effect[i].x = exp_effect[i].first_x;
	exp_effect[i].y = exp_effect[i].first_y;
	exp_effect[i].gamecount_point = gamecount;
	exp_effect[i].init_flag = 1;
}
else{
	/*移動部分*/
}

初期化用のフラグ「exp_effect[i].init_flag == 0」の時は初期化されていないので初期化をします。

初期座標はその時消滅した敵の座標を移した「exp_effect[i].first_x,exp_effect[i].first_y」ですね。

あとは基準となる「gamecount」を記録して初期化完了です。

では移動部分を見てみましょう。

先ほどの「else」部分ですね。

if (gamecount < exp_effect[i].gamecount_point + 30){

}
else{
	exp_effect[i].move_flag = 0;
	exp_effect[i].init_flag = 0;
}

「gamecount_point」を基準に「30」カウント経過した時点で消滅します。

座標を中央に・表示

こちらは前回までと同じような処理なので省略させて頂きます。

画像(cdxs_9_1)

爆発エフェクトが出来ました!

ここまでの中間ソースになります。

中間ソース8

次回はアイテムを発生させます。

次回

十日目 アイテム

□ページの先頭へ□

□目次へ戻る□

□HOME□

広告

↓2017年06月16日発売↓

やさしいC 第5版 (「やさしい」シリーズ)

新品価格
¥2,700から
(2017/5/1 13:05時点)

↓2014年08月09日発売↓

新・明解C言語 入門編 (明解シリーズ)

新品価格
¥2,484から
(2017/5/1 13:08時点)

↓2016年02月20日発売↓

新・解きながら学ぶC言語

新品価格
¥2,160から
(2017/5/1 13:10時点)

↓2017年02月11日発売↓

C言語プログラミング基本例題88 88

新品価格
¥3,024から
(2017/5/1 13:12時点)

↓2016年12月15日発売↓

Cの絵本 第2版 C言語が好きになる新しい9つの扉

新品価格
¥1,490から
(2017/5/1 13:13時点)

↓2017年02月08日発売↓

新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ)

新品価格
¥2,700から
(2017/5/1 13:15時点)