2019年05月09日

ActiveBasicとDXライブラリでゲームプログラミング!~第7回・追いかけゲームを作ってみよう!その2

n88_reon.gif
玲音:どうも! 今回もよろしくお願いします! 玲音です!

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

n88_reon.gif
誘惑されて、なんて、人聞きが悪いなぁ……。さてさて、前回はタイトル画面を表示させるところまで行ったんだったよね。それじゃ今回は、キャラクターの移動処理を作っていきましょう!

n88_kaede.gif
はーい!

~まずは自分を表示させよう

n88_reon.gif
さて、まずは自分の表示からね。まずは、プログラムの最初のほう、
Dim hndTitle As Long
のすぐ下当たりに、次の三行を入れてね。

abdx1905-a01.JPG

n88_reon.gif
変数hndMyCharaは、自分のキャラの画像のハンドルを格納する場所、変数myXとmyYが、自分のキャラの位置だよ。

n88_kaede.gif
はい。できましたよ、先輩っ。

abdx1905-s01.JPG
▲ 赤枠が追加した部分です。

n88_reon.gif
では次です。InitProcの中に、次の文を書いてください。

abdx1905-a02.JPG

n88_kaede.gif
自分のキャラの画像を読み込んで、ハンドルを変数hndMyCharaに格納してるんですよね。

n88_reon.gif
うん、そうだよ。そして次。さらにその下に、次の二行を入れてね。

abdx1905-a03.JPG

abdx1905-s02.JPG
▲ 追加されたInitProcはこのようになります(赤枠の中が追加した部分です)

n88_reon.gif
ここでは、自分の最初の位置を設定しているんだよ。ここで、今回の位置の決め方について説明しておくね。

n88_kaede.gif
はーい!

n88_reon.gif
今回作るゲームでは、座標をキャラクター単位で計算します。「横に3キャラ分、縦に1キャラ分」というわけだね。

n88_kaede.gif
ということは、左上は(0, 0)なのは同じだけど、右下は(19(640÷32-1), 14(480÷32-1))となるわけですねっ。(0から始まっているので、実際は割った答えより1少なくなる)

n88_reon.gif
うん、そうだよ。どうしてこうするかというと、自分が敵を捕まえたかどうかの判定が簡単にできるから。自分の座標と敵の座標が同じなら捕まえたって、簡単に判定できるからね。

n88_kaede.gif
ということは、キャラクター単位でなく、ドット単位だと変わってきちゃうんですか?

n88_reon.gif
うん。その場合は、ちょっと複雑なやり方が必要になるの。それは、後の機会に話すね。

n88_kaede.gif
はーい。

n88_reon.gif
さて。次は、プログラムの一番の下に次の三行を書いてね。

abdx1905-a04.JPG

n88_kaede.gif
新しいサブプロシージャの登場ですね!

n88_reon.gif
そうだよ。ここでは、自分のキャラを、変数myXとmyYがあらわす位置に表示させてるの。myXとmyYに32を掛けているのは、座標をドット単位に直しているんだよ。

n88_kaede.gif
あー。変数はキャラクター単位だから、直さないと正しい位置に表示されませんもんね。

n88_reon.gif
うん。その通り。そして最後。GameProcの中、具体的には、Sub GameProc()のすぐ下に、次の一行を打ち込んで。

abdx1905-a05.JPG

abdx1905-s03.JPG
▲ GameProcはこのようになります(赤枠が追加したところ

n88_kaede.gif
サブプロシージャDrawMyCharaを呼び出してるんですね。ここは簡単ですね。

n88_reon.gif
うん。それじゃ、ここまでできたら、実行してみて。

n88_kaede.gif
はーい。

abdx1905-g01.JPG

n88_kaede.gif
画面の右下に自分のキャラが表示されましたよ!

n88_reon.gif
うまくいったみたいだね。それじゃ続いて、移動のところもやっちゃおう!

n88_kaede.gif
はーい!

~移動させよう!

n88_reon.gif
さて、自分のキャラクターの移動だけど、これはそんなに難しくないよ。まずは、Sub DrawMyChara()のすぐ上に、次の文を打ち込んで。

abdx1905-a06.JPG

n88_kaede.gif
はーい。できましたよ。また新しいサブプロシージャの登場ですね!

n88_reon.gif
うん。このサブプロシージャMoveMyCharaでは、キー入力の受付と、キャラクターの移動をやっているよ。ここから、四つの部分に分けて説明していくね。

abdx1905-s04.JPG

n88_reon.gif
まずは、赤枠の部分は、ここはジョイパッドの状態を格納する変数を定義しているよ。

n88_kaede.gif
そして、青枠の部分では、その変数vPadに、dxGetJoypadInputState関数を使って、ジョイパッドの内容を入れてるんですよね。

n88_reon.gif
うん、そのとおり。続いて緑枠の部分では、vPadに入ったジョイパッドの内容に従って、myXとmyYの値を変える……つまり移動……ことをやっているよ。X(横)位置を例にとると、減らすと左に、増やすと右に移動することになる、というのは前にやったよね。

n88_kaede.gif
はいっ。そして最後の紫の部分は?

n88_reon.gif
ここでは、myX、myYの値が画面の範囲(myXが0~19、myYが0~14)を超えたときに、画面の端の位置になるように修正する処理をやっているよ。

n88_kaede.gif
なるほどっ。

n88_reon.gif
さて、このまま続けて、敵キャラの動きもやっていくよっ。

~敵キャラも動かそう!

n88_reon.gif
敵キャラの処理だけど、まずはプログラムの最初のほうに、次の文を書いてね。

abdx1905-a07.JPG

abdx1905-s05.JPG
▲ 追加後はこのようになります(赤枠が追加したところ)

n88_kaede.gif
enXやenYは……敵キャラの位置ですよね?

n88_reon.gif
うん。そして、hndEnemyは敵キャラの画像のハンドルを格納する変数だよ。さて、それが済んだら、InitProcに次の三行を追加してね。

abdx1905-a08.JPG

abdx1905-s06.JPG
▲ 追加後はこのようになります(赤枠が追加したところ)

n88_kaede.gif
一行目で、敵の画像を読み込んでハンドルをhndEnemyに格納し、enXとenYに敵の最初の位置を設定してるんですね。

n88_reon.gif
うん、その通り。ここで使っているdxGetRand関数は、0~()内の数字までのでたらめな数を返す関数だよ。

n88_kaede.gif
なるほどっ。

n88_reon.gif
さてさて。そして最後に、プログラムの最後に、次の文を書いてね。ここでは、二つのサブプロシージャを追加しているよ。

abdx1905-a09.jpg

n88_reon.gif
まず、サブプロシージャMoveEnemyでやっていることは簡単。乱数で0か1の数を出して、乱数が0なら、逃げるように敵キャラを動かし、そうでない(1)なら、ランダムに敵キャラを動かしているの。

n88_kaede.gif
先輩、ここで使われているSgnって関数はなんなんですか?

n88_reon.gif
これは、()の中の値が正の値か負の値かを返す関数だよ。正の値なら1を、負の値なら-1を返すの。今回はこれを、敵から逃げるための移動量の計算に使っているよ。詳しくは次回に説明するね。


n88_kaede.gif
はーい。そして、DrawEnemyでやっていることも簡単で、enX、enYが指定した位置に敵キャラを表示する、ですよね?

n88_reon.gif
うん、その通り。さて、それじゃ実行してみようか。


n88_kaede.gif
はーい。……うわっ。自分も敵も動くんですけど、動きが早すぎますっ。どうしたらいいんですか?

n88_reon.gif
それも次回に説明するよ。次回は、さっき話したSgnをどう使っているのか、ということと、動きを適度な速さにする方法、そして敵を捕まえた判定を入れて、ゲームを完成させるよ。お楽しみに!



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