玲音:どうも玲音です! さてさて、楓ちゃんに変なこと言われる前に、講座を始めていきましょう!
今回は、敵の表示と移動について説明していきますよ!
楓:先手打たれちゃったー。どうも、楓です。今日もよろしくお願いしますっ。
ふふん、私だって、いつもやられてばかりじゃないよー。それじゃ初めていきましょう!
~敵に必要な変数は?~
さて、まずは敵の移動や表示に関係する変数の定義から始めていこうか。
''メイン関数 の前のあたりに、次のコードを書いてね。
あの、先輩。このeFlagって配列変数はなんですか?
うん。それは、その番号の敵が出現しているかどうかを表すフラグだよ。これが1になってる敵だけを表示、移動させるようにするんだ。
なるほどー。
それと、eFireTimeは、出現してから弾を発射するまでの時間。eTimeCntは出現してから経過した時間だよ。
eTimeCntがeFireTimeと同じになったら、弾を発射するようにする予定。
~敵を作ろう!~
さて。それでは、まずは敵を出現させる処理から作っていこうか。でもその前に一つやっておかなくちゃならないことがあるの。わかる?
しなくちゃならないこと? うーん……。
それは、まだ使われていない番号を探すこと。使われている番号を使ってしまうと、移動中の敵が、突然別のところに出現した!ってことになっちゃうでしょ?
あぁ、なるほどっ。
ということでさっそく、使われていない敵の番号を探す関数、FindEmptyEnemyを作りましょう。これですっ!
といっても、やってることは前回作ったGetShotIDと同じだけどね。
ふむふむ。これを使って、見つけた番号に敵を作っていくわけですね!
うん、その通り。それでは改めて、敵を作るサブプロシージャ『CreateEnemy』を作っていきましょう! とはいっても、やってることはCreateShotとほぼ同じだけどね。
出現するX座標と弾を発射するまでの間隔は、乱数(でたらめな数)で決めてるよ。dxGetRand関数は、0から()の中までの乱数を返すものだってことは、前の講座で話したよね。
はいっ。
13行目の
eFireTime(id) = 40 + dxGetRand(20)
にも注目。
このような書き方をすることで、例えばこの例だと40から60までの乱数を取り出すことができるよ。
なるほどー。
さて、次は移動と表示の処理も作っていこうか。と言っても、することは難しくないよ。For~Nextのループで敵の番号を回して、eFlagが1のものだけを移動、そして表示させてるだけ。そして移動の結果、敵が画面外に出たら、eFlagを0に戻してる、と。
ふむふむ。
では、まずは画像の読み込みからやっていこうか。
サブプロシージャMaterialLoadに、次のコードを書いてね。
↑追加後のMaterialLoadはこうなります。(赤枠で囲まれたのが追加したところ)
続いて、敵の移動を処理するサブプロシージャMoveEnemyだよ。
そして、こちらが敵の描画を処理するサブプロシージャDrawEnemy。やっているのが移動か描画の違いだけで、ほとんど、MoveEnemyと同じだけどね。
そして、この二つのサブプロシージャを実行し、さらに敵の出現の制御を行う、いわば上記二つのサブプロシージャの親玉というべきサブプロシージャ、EnemyMainだよ。
ここでは、MoveEnemyとDrawEnemyを呼び出す他にも、totalTimeをカウントアップして、30の倍数になるごとに、CreateEnemyを呼び出して敵を作ることもやっているよ。Mod演算子は、割った余りを計算する演算子なんだけど、このように使えば、一定の値ごとに処理を呼び出す処理を作ることができるんだ。
なるほどー。
さて、ではこのEnemyMainサブプロシージャを、GameMainの中に組み込もう! GameMainの中に、次のコードを付け加えてね。
↑付け加えた後のGameMain。(赤枠内が追加されたコード)
できたら実行してみて。
はーい。おおっ! 画面の上から敵キャラが下に移動していきますっ!
では今回はここまで。次回は、弾を撃つ処理をやっていくよ。よろしくね!
==========
※次の更新は、『師匠TのチャレンジARSゲーム!』の予定です。お楽しみに!