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


敵の速度を変化させる。
今回はこれについてやってみようと思います。
最初はゆっくり。敵の残りが減るとどんどん早くなる。 ということは、敵の数を使って、ウエイトをかけていけば、残りが減れば、ウエイトも減る。

そこで、今回作ったのは、敵の現在の数を得る関数NumCheckEnemy()。
返り値に現在生きてる数を返してきます。また、これを別利用して、ゲームクリアの判定も作りました。

GameMainの最初にクリア判定、あたり判定、各移動の順で並べれば、最後の敵を倒したとき、
数秒とまって、また次のゲームが始まるようになっています。

また、今回いろんな数字を微調整しました。筆者は細かい数字をすべてマクロ化していなかったので、
微調整すべき数字がどこにあるか探してしまいました。
こういうことの内容、後で変えるかもしれない数字は、マクロ化しましょう。





サンプル
Game.hにint NumCheckEnemy(void);を追加
GameInitClearOver.cppのソース

void CheckClear() //クリア判定 { if(NumCheckEnemy() == 0) { SDL_Delay(1000); GameInit(); } }

Enemy.cppの追加ソース

static int WaitEnemyMove = 0; void MoveEnemy() { if(WaitEnemyMove == 0) { WaitEnemyMove = NumCheckEnemy() - 1; //カウントが0なら、今の数を取得し、移動の処理をする。 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 = 16; EnemyDown = 1; break; }else if(Enemy[i].ex > 590) //右の限界点 { EnemyLR = -16; 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 += 16;} //下段移動中なら下へ。 else {Enemy[i].ex += EnemyLR;} //そうでないなら、左右へ。 DrawImg(32,0,32,32,Enemy[i].ex,Enemy[i].ey); } }else{ for(int i=0;i < ENEMY_MAX;i++) //ウエイト中の処理 { if(Enemy[i].eLive == 0) continue; DrawImg(32,0,32,32,Enemy[i].ex,Enemy[i].ey); } WaitEnemyMove--; //ウエイト中ならカウントを進める。 } } int NumCheckEnemy() { int e; for(int i = 0; i < ENEMY_MAX; i++) { if(Enemy[i].eLive == 1) e++; } return e; }



〜〜第十一話へ〜〜