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


今回のお題は、敵のミサイルです。

自機のミサイルと処理はほぼ同じなのですが、一つ違うことといえば、
「発射するのがランダムである。」でしょう。
ということで、今回は乱数の作り方を紹介します。

といっても、乱数の作り方は、C言語の標準ライブラリで簡単にできるので、特にSDLで行うことはありません。
stdlib.hにある、rand()を使います。
rand()は、0〜32767までの数字をランダムで取り出す関数です。

int r = rand();

これで、rには、0〜32767のどれかが入りました。

しかし、実用するには、少し工夫が必要ですね。
たとえば、0〜4の間の乱数がほしい場合。たいていこの様に指定します。

int r = ( rand() % 5);

0〜32767までの数字を5で割った余り。余りですから、結果は、0,1,2,3,4のどれかしかありません。

こうして、乱数が出来上がりました。
しかし、実はこれだけでは足りないことがまだあります。
毎回起動しても、乱数の作り方がいつも決まってしまうことです。
これを避けるためには、乱数を新しく作り直す命令が必要です。

srand()

引数に整数を入れれば、新しい乱数ができます。しかし、これでも、その整数で決まった乱数ができてしまうので、さらに、

time()

を引数に使います。そうすれば、timeは常に違う数字なので、乱数は、本当にランダムな数字になります。

srand( (unsigmed)time(NULL) );
int r = ( rand() % 5 );

また、今回は敵のミサイルと自機の当たり判定も加えてみました。敵のときと同じやり方です。
また、それに伴って、ゲームオーバーも作りました。これも、ゲームクリアと同じ方法です。

だいぶごちゃごちゃしてきたので、次回まとめて整理して解説していきます。



サンプル



Game.hに
void InitMissileEnemy(void);
void MoveMissileEnemy();
void GoMissileEnemy(int x,int y);

void GetCx(void); void GetCy(void); void GetMEx(int i); void GetMEy(int i); void DeleteMissileEnemy(int i); void DeleteChara();
を追加

GameMain.cppにMoveMissileEnemy();
GameInitClearOver.cppにInitMissileEnemy();


Enemy.cppの追加ソース

MoveEnemyの描画後に GoMissileEnemy(Enemy[i].ex,Enemy[i].ey); を追加

MissileEnemy.cppのソース

#include "Def.h" struct MISSILEENEMY { int meX; int meY; int meGo; }; static MISSILEENEMY MissileEnemy[MEMAX]; void InitMissileEnemy() { for(int i;i < MEMAX;i++) { MissileEnemy[i].meX = 0; MissileEnemy[i].meY = 0; MissileEnemy[i].meGo = 0; } } void MoveMissileEnemy() { for(int i=0;i < MEMAX;i++) { if(MissileEnemy[i].meGo == 1) { MissileEnemy[i].meY += 4; if(MissileEnemy[i].meY > 440) {MissileEnemy[i].meGo = 0;} DrawImg(32,0,32,32,MissileEnemy[i].meX,MissileEnemy[i].meY); } } } void GoMissileEnemy(int x,int y) { for(int i=0;i < MEMAX;i++) { if(MissileEnemy[i].meGo ==0) { int r = rand() % 180; if(r == 1) { MissileEnemy[i].meGo =1; MissileEnemy[i].meX =x; MissileEnemy[i].meY =y+16; break; } } } }



〜〜第十二話へ〜〜