玲音:こんにちは! 玲音です!
楓:こんにちは! 気づいたら、この講座に引きずり込まれてた、玲音先輩の後輩の楓です!
今月もよろしくお願いします!
あ、言われちゃった。しまったなぁ。だから、引きずり込んだんじゃないってばぁ……。
えへへ、それで先輩。今回は、弾の発射処理を作るんでしたよね?
うん。その通り。今回は、弾の発射角度の計算から、そこから弾の移動量を計算する処理、そして実際の弾の移動をやっていくよ。張り切っていこう!
はーい!
~まずするべきことは?
さてさて。弾の処理を作る前にするべきことがあります。それはなんでしょう?
はーい! 弾の変数を用意して初期化し、そして弾の画像を読み込んでおくことでーす!
それでは、まずは弾の変数の定義からやっていこうー!
''メイン関数 の前あたりに、次の文を書いてね。
新しい配列変数、bVX()とbVY()が登場しましたね。これはどんな役割をする変数なんですか?
うん。この二つは、弾の移動量を保存しておく変数だよ。bVX()がX(横)方向、bVY()がY(縦)方向。この分だけ、弾を動かすようにするんだ。
なるほどー。
bFlag()はその弾が存在しているかどうかを表す変数、bX()、bY()が位置を表す変数だよ。
hnbBalletは、弾の画像のハンドルが入る変数ですよね。
その通り。そして、BALLETSは弾の数を表す定数だよ。では続いて、弾の初期化をする関数を作っていこう!
こちらだよ。
そんなに難しくないですね。
そうだね。For~Nextで回して、配列変数bFlag()に0を入れてるだけだからね。
あ、そうだ。敵キャラの情報を初期化するサブプロシージャも作らないとね。こちらだよ。
では、これらを呼び出す命令も入れていこう。サブプロシージャStageInitの中にこれを書いてね。
↑入れた後のStageInitはこうなります。(赤枠が追加した文)
続いて、画像を読み込む部分も書いていこうか。サブプロシージャMaterialLoadにこれを追加して。
↑入れた後のMaterialLoadはこうなります。(赤枠が追加した文)
さて、ここまでできたら準備はOK! いよいよ本番だよ!
はーい!
~弾を作るために必要なものは?
さて、弾を作る処理を作る前に、一つ作らなければならない処理があります。それはなんでしょう?
うーん、なんでしょうか? わからないですー。
くすくす。それは、弾を撃つ敵機と自機との角度を求めることと、その角度を元に移動量を計算することでーす。
ということで、まずは角度を計算する関数を作ろう。まずは、次のファイルをダウンロードして、解凍したAtan2.dllをプログラムのフォルダに入れてね。
それが済んだら、次の行をプログラムの一行目に追加してください。
それができたら、いよいよ関数を作っていきましょう! こちらです!
まず、最初に追加したDeclareから始まる文は、ActiveBasicに、Atan2.Dllの中に入っている_Atan2という関数を使いますよ、と教えている文だよ。これを書くことによって、この関数を使えるようになるの。
ふむふむ。
そして関数の中身だけど、ちょっと難しいから細かいことは省略するね。やっていることは、自機と敵機の間の角度を求めている、というもの。なお、求めているのは普通の角度ではなくてラジアンだよ。
ラジアン?
ラジアンというのは、(180÷π)度を1ラジアンとする、特別な角度の単位で、コンピュータの世界ではよく使われるんだよ。さて、続いて、弾を作る処理をやっていこうか。まずは、空いている弾を探す関数ね。
これについて難しくないよね。今までやってきたのと同じだから。
はいっ。
それでは続いて、弾を作る処理です!
ここは、基本的には、敵やショットを作るときと同じ。弾の位置を決める方法が違うのと、移動量を決めているのが違いだね。
弾の位置を決める時には、どうして16を足して、5を引く、というようなことをしてるんですか?
それは、弾の初期位置が敵の中心にしているのと、そしてdxDrawGraphを使うとき、指定するのは画像の左上隅の座標だからだよ。敵の画像サイズは32×32だから、その半分の16を足して、敵の中心の位置を計算して、そこから弾のサイズの10の半分である5を引いて、弾の左上の座標を計算してるんだ。
Angle関数の中で、敵の位置に16を足しているのも同じ理由だし、自機の位置に数値を足してるのも同じ。
なるほどー。
さて、そしたら後は弾の処理だね。まずは弾の移動!
弾は、いろんな方向に飛ぶから、ここでは上下左右について、画面外に出たかどうかをチェックしているよ。そして出たら弾を消している、と。では続いて、弾の描画処理です!
そして、これらの処理を呼び出すBalletMainサブプロシージャです!
そして、弾を発射するコードを、MoveEnemyサブプロシージャ内に書きましょう!
配列関数eTimeCnt()を1ずつ増やしていき、eFireTime()と同じ値になったら、BalletCreateサブプロシージャを呼び出して、eTimeCnt()を0にする、ということをしているよ。
↑処理を追加した後のMoveEnemyはこうなります。(赤枠が追加した部分)
そして、後は、GameMainサブプロシージャに次の一行を書き加えればOKだよ。できたら実行してみてね。
↑入れた後のGameMainはこうなります。(赤枠が追加した文)
おー! 敵が弾を撃ってくるようになりましたよ!
それでは、今回はここまで。次回は自機と敵、自機と敵弾、敵とショットの当たり判定を作っていくよ! また次回!
そうそう、今回から、その回までのソースファイルを公開することにしたよ。こちらからダウンロードしてね!
==========
※次の更新は、『師匠TのチャレンジARSゲーム!』の予定です。お楽しみに!