2019年10月14日

ActiveBasicとDXライブラリでゲームプログラミング!~第12回・シューティングゲームを作ろう!その4

n88_reon.gif
玲音:こんにちは! 玲音です!

n88_kaede.gif
楓:こんにちは! 気づいたら、この講座に引きずり込まれてた、玲音先輩の後輩の楓です!
今月もよろしくお願いします!

n88_reon.gif
あ、言われちゃった。しまったなぁ。だから、引きずり込んだんじゃないってばぁ……。

n88_kaede.gif
えへへ、それで先輩。今回は、弾の発射処理を作るんでしたよね?


n88_reon.gif
うん。その通り。今回は、弾の発射角度の計算から、そこから弾の移動量を計算する処理、そして実際の弾の移動をやっていくよ。張り切っていこう!

n88_kaede.gif
はーい!


~まずするべきことは?

n88_reon.gif
さてさて。弾の処理を作る前にするべきことがあります。それはなんでしょう?

n88_kaede.gif
はーい! 弾の変数を用意して初期化し、そして弾の画像を読み込んでおくことでーす!

n88_reon.gif
それでは、まずは弾の変数の定義からやっていこうー!
''メイン関数 の前あたりに、次の文を書いてね。

abdx1910c01.JPG

n88_kaede.gif
新しい配列変数、bVX()とbVY()が登場しましたね。これはどんな役割をする変数なんですか?

n88_reon.gif
うん。この二つは、弾の移動量を保存しておく変数だよ。bVX()がX(横)方向、bVY()がY(縦)方向。この分だけ、弾を動かすようにするんだ。

n88_kaede.gif
なるほどー。

n88_reon.gif
bFlag()はその弾が存在しているかどうかを表す変数、bX()、bY()が位置を表す変数だよ。

n88_kaede.gif
hnbBalletは、弾の画像のハンドルが入る変数ですよね。

n88_reon.gif
その通り。そして、BALLETSは弾の数を表す定数だよ。では続いて、弾の初期化をする関数を作っていこう!
こちらだよ。

abdx1910c02.JPG

n88_kaede.gif
そんなに難しくないですね。

n88_reon.gif
そうだね。For~Nextで回して、配列変数bFlag()に0を入れてるだけだからね。
あ、そうだ。敵キャラの情報を初期化するサブプロシージャも作らないとね。こちらだよ。

abdx1910c03.JPG

n88_reon.gif
では、これらを呼び出す命令も入れていこう。サブプロシージャStageInitの中にこれを書いてね。

abdx1910c04.JPG

abdx1910l01.JPG
↑入れた後のStageInitはこうなります。(赤枠が追加した文)

n88_reon.gif

続いて、画像を読み込む部分も書いていこうか。サブプロシージャMaterialLoadにこれを追加して。


abdx1910c05.JPG

abdx1910l02.JPG
↑入れた後のMaterialLoadはこうなります。(赤枠が追加した文)

n88_reon.gif
さて、ここまでできたら準備はOK! いよいよ本番だよ!

n88_kaede.gif
はーい!


~弾を作るために必要なものは?

n88_reon.gif
さて、弾を作る処理を作る前に、一つ作らなければならない処理があります。それはなんでしょう?

n88_kaede.gif
うーん、なんでしょうか? わからないですー。

n88_reon.gif
くすくす。それは、弾を撃つ敵機と自機との角度を求めることと、その角度を元に移動量を計算することでーす。
ということで、まずは角度を計算する関数を作ろう。まずは、次のファイルをダウンロードして、解凍したAtan2.dllをプログラムのフォルダに入れてね。


n88_reon.gif
それが済んだら、次の行をプログラムの一行目に追加してください。

abdx1910c06.JPG

n88_reon.gif
それができたら、いよいよ関数を作っていきましょう! こちらです!

abdx1910c07.JPG

n88_reon.gif
まず、最初に追加したDeclareから始まる文は、ActiveBasicに、Atan2.Dllの中に入っている_Atan2という関数を使いますよ、と教えている文だよ。これを書くことによって、この関数を使えるようになるの。

n88_kaede.gif
ふむふむ。

n88_reon.gif
そして関数の中身だけど、ちょっと難しいから細かいことは省略するね。やっていることは、自機と敵機の間の角度を求めている、というもの。なお、求めているのは普通の角度ではなくてラジアンだよ。

n88_kaede.gif
ラジアン?

n88_reon.gif
ラジアンというのは、(180÷π)度を1ラジアンとする、特別な角度の単位で、コンピュータの世界ではよく使われるんだよ。さて、続いて、弾を作る処理をやっていこうか。まずは、空いている弾を探す関数ね。

abdx1910c08.JPG

n88_reon.gif
これについて難しくないよね。今までやってきたのと同じだから。

n88_kaede.gif
はいっ。

n88_reon.gif
それでは続いて、弾を作る処理です!

abdx1910c09.JPG

n88_reon.gif
ここは、基本的には、敵やショットを作るときと同じ。弾の位置を決める方法が違うのと、移動量を決めているのが違いだね。

n88_kaede.gif
弾の位置を決める時には、どうして16を足して、5を引く、というようなことをしてるんですか?

n88_reon.gif
それは、弾の初期位置が敵の中心にしているのと、そしてdxDrawGraphを使うとき、指定するのは画像の左上隅の座標だからだよ。敵の画像サイズは32×32だから、その半分の16を足して、敵の中心の位置を計算して、そこから弾のサイズの10の半分である5を引いて、弾の左上の座標を計算してるんだ。
Angle関数の中で、敵の位置に16を足しているのも同じ理由だし、自機の位置に数値を足してるのも同じ。

n88_kaede.gif
なるほどー。

n88_reon.gif
さて、そしたら後は弾の処理だね。まずは弾の移動!

abdx1910c10.JPG

n88_reon.gif
弾は、いろんな方向に飛ぶから、ここでは上下左右について、画面外に出たかどうかをチェックしているよ。そして出たら弾を消している、と。では続いて、弾の描画処理です!

abdx1910c11.JPG

n88_reon.gif
そして、これらの処理を呼び出すBalletMainサブプロシージャです!

abdx1910c12.JPG

n88_reon.gif
そして、弾を発射するコードを、MoveEnemyサブプロシージャ内に書きましょう!
配列関数eTimeCnt()を1ずつ増やしていき、eFireTime()と同じ値になったら、BalletCreateサブプロシージャを呼び出して、eTimeCnt()を0にする、ということをしているよ。

abdx1910c13.JPG
↑処理を追加した後のMoveEnemyはこうなります。(赤枠が追加した部分)

n88_reon.gif
そして、後は、GameMainサブプロシージャに次の一行を書き加えればOKだよ。できたら実行してみてね。

abdx1910c14.JPG

abdx1910l03.JPG
↑入れた後のGameMainはこうなります。(赤枠が追加した文)

n88_kaede.gif
おー! 敵が弾を撃ってくるようになりましたよ!




n88_reon.gif
それでは、今回はここまで。次回は自機と敵、自機と敵弾、敵とショットの当たり判定を作っていくよ! また次回!

n88_reon.gif
そうそう、今回から、その回までのソースファイルを公開することにしたよ。こちらからダウンロードしてね!


==========

※次の更新は、『師匠TのチャレンジARSゲーム!』の予定です。お楽しみに!

この記事へのコメント
コメントを書く
コチラをクリックしてください