第二章「実戦!SDLでゲーム作り@〜某宇宙人〜」第七話


自機にミサイル。これだけでも、最初は感動してしまいます。
しかし、まだまだゲームに必要なものがあります。
今回は敵キャラを作っていきます。

某宇宙人ゲームの敵といえば、最初から縦横きちんと並んでいて、
動きは、左右一方に動き、一番端のキャラが画面端に届いたら、一段下がり左右反転する。
というものでしたね。

それを再現してみましょう。

ミサイルのときと同様に、敵の情報も構造化して、管理しやすくします。
そして、今回、敵の動きのキーとなる定数を二つ用意しました。
EmenyLRと書いてある変数が敵の左右の方向を決める変数です。今回は+5か、-5に変化しています。
そして、EnemyDownは、一度だけ行われる下段進行のためのスイッチです。

敵のうち誰かが、右か左の限界地に来たとき、左右の向きを反転し、EnemyDownが1になり、
それまでの左右の動きをとめて、下段へ移動し、
次回MoveEnemy()の処理が回ってきたとき、EnemyDownを0にして、左右の動きを戻します。




サンプルソース

GameMain.cppにMoveEnemy();を追加
GameInitOver.cppにInitEnemy();を追加
Game.hの追加ソース

void InitEnemy(void); //初期処理敵 void MoveEnemy(void); //敵移動処理 #define ENEMY_LINEX 10 #define ENEMY_LINEY 5 #define ENEMY_MAX 50

Enemy.cppのソース

#define __ENEMY_CPP__ #include "Def.h" struct ENEMY //敵の情報構造体 { int ex; int ey; int eLive; //生死情報 }; static ENEMY Enemy[ENEMY_MAX]; static int EnemyLR; //敵の左右の方向を決める変数 static int EnemyDown; //敵が下に移動中のときの変数 void InitEnemy() { EnemyLR = 5; //最初は右向きでスタート for(int y=0;y < ENEMY_LINEY;y++) { for(int x=0;x < ENEMY_LINEX;x++) { int i = (y * ENEMY_LINEX) + x; Enemy[i].ex=(x * 48)+20; //この数字は敵と敵の間隔+左から20ピクセル右に置いてる。 Enemy[i].ey=y * 48; Enemy[i].eLive = 1; } } } void MoveEnemy() { if(EnemyDown == 0) //下段移動中でなければ { for(int i=0;i < ENEMY_MAX;i++) { if(Enemy[i].eLive == 0) continue; //もし[i]番目の敵が死んでたら、今回尾処理はパス if(Enemy[i].ex < 20) //敵のうち、誰かが左の限界点にいたら、左右反転、下段ON、ループを抜ける。 { EnemyLR = 5; EnemyDown = 1; break; }else if(Enemy[i].ex > 590) //右の限界点 { EnemyLR = -5; EnemyDown= 1; break; } } }else{ EnemyDown = 0 ;} //下段移動中なら、下段OFF for(int i=0;i < ENEMY_MAX;i++) //移動処理 { if(Enemy[i].eLive == 0) continue; if(EnemyDown){Enemy[i].ey += 5;} //下段移動中なら下へ。 else {Enemy[i].ex += EnemyLR;} //そうでないなら、左右へ。 DrawImg(32,0,32,32,Enemy[i].ex,Enemy[i].ey); } }



〜〜第八話へ〜〜