広告
↓発売日:2018年09月22日↓
新品価格 |
今回はアイテムを作ります。
前回までとかわらずほとんど同じような処理なので軽く説明したいと思います。
構造体になります。
#define ITEM_MAX 10 struct ITEM{ double first_x; double first_y; double x; double y; double draw_x; double draw_y; double m_x,m_y; double a_x,a_y; double f_x,f_y; int init_flag; int move_flag; int move_type; int gamecount_point; double range; }; struct ITEM item[ITEM_MAX];
いつも通りの座標やフラグですね。
アイテムはプレイヤーと接触するので当たり判定範囲の「range」があります。
double m_x,m_y; double a_x,a_y; double f_x,f_y;
このあたりはアイテムに動きをつける時に必要な変数なのでその時にでも説明いたします。
初期化します。
void my_init_item(){ for (int i = 0; i < ITEM_MAX; i++){ item[i].first_x = 0; item[i].first_y = 0; item[i].x = 0; item[i].y = 0; item[i].draw_x = 0; item[i].draw_y = 0; item[i].m_x = 0; item[i].m_y = 0; item[i].a_x = 0; item[i].a_y = 0; item[i].f_x = 0; item[i].f_y = 0; item[i].init_flag = 0; item[i].move_flag = 0; item[i].move_type = 0; item[i].range = 10; item[i].gamecount_point = 0; } }
当たり判定範囲「range」は「10」それ以外は全て「0」で初期化しているだけです。
アイテムの流れを見てみましょう。
1・アイテムを持っている敵が消滅する時にアイテム発生!!
2・アイテムが発生したら現在未使用の「アイテムの入れ物」を調べて使用中に
3・その時の初期座標などを「アイテムの入れ物」に登録
4・その「アイテムの動き方」に応じて出現・計算・表示
5・終わったら再び「アイテムの入れ物」を未使用に
ではアイテムが発生するトコロから見ていきましょう。
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); if(enemy[i].item_flag == 1){ my_set_item(enemy[i].x,enemy[i].y,0); } } } } }
敵が死亡する時にアイテムを発生させるので追加するのは「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); if(enemy[i].item_flag == 1){ my_set_item(enemy[i].x,enemy[i].y,0); } }
消滅する敵の中で「enemy[i].item_flag == 1」とアイテムを持った敵がいた場合「my_set_item()」で同じように座標・動き方の値などを渡してアイテムを発生させます!
では「my_set_item()」の中身を見てみましょう。
void my_set_item(double x,double y,int item_type){ for(int i = 0;i < ITEM_MAX;i++){ if(item[i].move_flag == 0){ item[i].move_flag = 1; item[i].first_x = x; item[i].first_y = y; item[i].move_type = item_type; break; } } }
同じように「item[i].move_flag == 0」の敵を探して座標と動き方を登録しているだけですね!
続いて実際の動きに入っていきます。
アイテムの動き方を計算する「my_move_item()」です。
少し長いので分けて説明します。
まずは全ての「アイテムの入れ物」を調べてそれが使用中かどうか調べます。
for(int i = 0;i < ITEM_MAX;i++){ if(item[i].move_flag == 1){ } }
ここで使用中「item[i].move_flag == 1」の状態のものがあった場合、そのアイテムは動いていなきゃいけないので動かします。
「switch」文で動き方を振り分けます。
switch (item[i].move_type){ case 0: break; default: break; }
今回は「case 0」普通のアイテムの動き方を作ります。
初期化部分と移動部分に分かれます。
初期化部分を見てみます。
if (item[i].init_flag == 0){ item[i].x = item[i].first_x; item[i].y = item[i].first_y; item[i].gamecount_point = gamecount; item[i].init_flag = 1; } else{ /*移動部分*/ }
初期化用のフラグ「item[i].init_flag == 0」の時は初期化されていないので初期化をします。
初期座標はその時消滅した敵の座標を移した「item[i].first_x,item[i].first_y」ですね。
あとは基準となる「gamecount」を記録して初期化完了です。
では移動部分を見てみましょう。
先ほどの「else」部分ですね。
if (gamecount < item[i].gamecount_point + 240){ item[i].y -= 2; } else{ item[i].move_flag = 0; item[i].init_flag = 0; }
「gamecount_point」を基準に下方に「2」ピクセルずつ移動、「240」カウント経過した時点で消滅します。
こちらは前回までと同じような処理なので省略させて頂きます。
アイテム発生!!!
ここまでの中間ソースになります。
次回はボスを作ります。
広告
↓発売日: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日↓
新品価格 |