広告
↓発売日:2018年09月22日↓
新品価格 |
今回は爆発エフェクトを作りたいと思います。
とてもささやかなものなので期待はしないでください。
では爆発エフェクトの構造体から見てみましょう。
#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」カウント経過した時点で消滅します。
こちらは前回までと同じような処理なので省略させて頂きます。
爆発エフェクトが出来ました!
ここまでの中間ソースになります。
次回はアイテムを発生させます。
広告
↓発売日:2016年02月29日↓
12歳からはじめる ゼロからのC言語 ゲームプログラミング教室 新品価格 |
↓発売日:2018年06月22日↓
新品価格 |
↓発売日:2018年03月09日↓
新品価格 |
↓発売日:2017年06月14日↓
新品価格 |
↓発売日:2018年05月21日↓
新品価格 |
↓発売日:2017年12月07日↓
新品価格 |
↓発売日:2017年02月08日↓
新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ) 新品価格 |
↓発売日:2017年09月26日↓
新品価格 |