2019年03月11日

ActiveBasicとDXライブラリでゲームプログラミング!~第5回・試しに、タイトル画面とゲーム画面を入れてみよう!

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

n88_kaede.gif
楓:こんにちは! 気が付いたらこの講座に引きずり込まれてた楓です! 今日もよろしくお願いします!

n88_reon.gif
えー、そうきたかー。

n88_kaede.gif
えへへ。それで先輩。今回は何するんですか?

n88_reon.gif
うん。前回は、プログラムの骨格をさらに発展させて、タイトルやゲームオーバーの処理などに分岐する骨組みに改造したよね。今回はそれに手を加えて、仮のタイトル画面やゲーム画面を入れてみようと思います!

n88_kaede.gif
おー、それは楽しみですね! 早くやりましょう、先輩!

n88_reon.gif
それじゃさっそくスタート!

~まずはタイトルをいれよう~
n88_reon.gif
まずは、これが最初の骨組みだったね。

abdx1903-01.jpg

n88_kaede.gif
そして、それらに前回説明してくれた修正をいろいろ加えたのがこれですよね。

abdx1903-02.jpg

n88_reon.gif
そうだね。それじゃこれに色々付け加えてみよう!
まずはタイトルからだね。

n88_kaede.gif
はーい。

n88_reon.gif
そうそう。今回はこれらの素材を使います。
あらかじめ、プログラムのフォルダに保存しておいてね。

title.jpg
haikei.bmp
niko.bmp

n88_reon.gif
では始めていこうか。
まずは、タイトル画面のハンドルを保存する変数が必要だよね。
さっそく定義しておこう!
Dim scene As Integer
の行の下に、次の行を付け加えてね。

Dim hndTitle As Long

n88_reon.gif
hndはHaNDleの略だよ。さて、次は画像をdxLoadGraph関数で読み込むんだけど、その前に関数を一つ付け加えておくね。
まずは、
Sub TitleProc()
の前にこれを付け加えて。

Sub InitProc()
   hndTitle = dxLoadGraph("title.jpg")
End Sub

n88_reon.gif
そして、
scene = TITLE
の前に、これも追加。

InitProc()

n88_reon.gif
これで読み込みはOK。後は表示させるだけ。
Sub TitleProc()

End Subの間に、こう書いてね。

dxDrawGraph(0, 0, hndTitle, FALSE)

n88_kaede.gif
はーい。できましたよ。

n88_reon.gif
できたら、実行してみてね。

n88_kaede.gif
はーい。それっ。

abdx1903-03.JPG

n88_kaede.gif
やったぁっ。タイトル画面が表示されましたよっ。
でも先輩。どうして、TitleProcの中で、画像を読み込まなかったんですか?

n88_reon.gif
プログラムの流れを考えてみて。メインのプログラムをDoとLoopで繰り返してるってことは、ゲーム画面に進むまで、TitleProcをえんえんと繰り返し呼び出すことになるじゃない?

n88_kaede.gif
ふむふむ。

n88_reon.gif
それで、読み込む処理をTitleProcの中でやっちゃうと、繰り返しのたびに読み込んで表示して読み込んで表示してを繰り返すことになるから、読み込みの分、時間がロスしちゃうよね?

n88_kaede.gif
あぁ、なるほど!

n88_reon.gif
そこで、最初の一回だけ画像を読み込むようにしているわけだよ。

n88_kaede.gif
なるほど、わかりましたー。

n88_reon.gif
さて、それじゃ次は、スペースを押したら画面を表示するようにしてみよう。スペースキーが押されたかどうかを調べるのは、dxGetJoypadInputState関数だったよね。

n88_kaede.gif
はいっ。それで、場面を変えるには、変数sceneの内容を変えればいいんでしたよねっ。

n88_reon.gif
うん。では楓ちゃん。この二つを組み合わせてやってみて。

n88_kaede.gif
はーい。こうすればいいんですよねっ。TitleProcの中のdxDrawGraphの文の下に……

=-=-=-=-=-=-=-=-=-=-
If (dxGetJoypadInputState(DX_INPUT_KEY_PAD1) And DX_PAD_INPUT_M) <> 0 Then
   scene = GAME
End If
=-=-=-=-=-=-=-=-=-=-

n88_kaede.gif
っと。えいっ。やったー。スペースキーを押したら画面が黒くなりましたよっ。

n88_reon.gif
うまくいったみたいだね。画面が黒くなったのは、まだGameProcの中には何も書いてないからだよ。
それじゃ次は、そのGameProcの中に色々書いて、ゲーム画面を作っちゃおう!

n88_kaede.gif
はーいっ。

~ゲーム画面を作ろう
n88_reon.gif
さて。次はゲーム画面を作るわけだけど、まず背景とキャラクタのハンドルを入れる変数が必要だね。
さっきの
Dim hndTitle As Long
の下に、これを追加しよう。

=-=-=-=-=-=-=-=-=-=-
Dim hndBack As Long
Dim hndChara As Long
=-=-=-=-=-=-=-=-=-=-

n88_kaede.gif
ふむふむ。

n88_reon.gif
続いて、InitProcの中に、背景とキャラクタを読み込む処理を追加。

=-=-=-=-=-=-=-=-=-=-
hndBack = dxLoadGraph("haikei.bmp")
hndChara = dxLoadGraph("niko.bmp")
=-=-=-=-=-=-=-=-=-=-

n88_reon.gif
そうそう。キャラクタの位置を示す変数も必要だね。
さっきのDim文の下に付け加えておこう。

=-=-=-=-=-=-=-=-=-=-
Dim charaX As Long
Dim charaY As Long
=-=-=-=-=-=-=-=-=-=-

n88_kaede.gif
位置の設定は、InitProcの中で、ですねっ。

=-=-=-=-=-=-=-=-=-=-
charaX = 50
charaY = 50
=-=-=-=-=-=-=-=-=-=-

n88_reon.gif
そしたらあとは、GameProcの中で、背景とキャラクタを表示させるだけだね。
Sub GameProc()とEnd Subの間に、こう書こう!

=-=-=-=-=-=-=-=-=-=-
dxDrawGraph(0, 0, hndBack, FALSE)
dxDrawGraph(charaX, charaY, hndChara, TRUE)
=-=-=-=-=-=-=-=-=-=-

n88_reon.gif
全体がこのようになっていればOKだよ。実行してみて?

abdx1903-04.jpg
abdx1903-04b.jpg
n88_kaede.gif
スペースキーを押したら、ゲーム画面に切り替わりましたよ!

abdx1903-05.JPG

n88_reon.gif
うまくいったみたいだね。今回はここまで……と言いたいところだけど、もうワンポイント。

n88_kaede.gif
なんですか?

n88_reon.gif
今回は全ての初期設定をInitProc関数の中でやったけど、例えばステージ別とか、全体の初期設定とか、ゲーム開始時の初期設定とか、色々と別々の初期設定をしたいときってあるよね?

n88_kaede.gif
あぁ、そういえば。

n88_reon.gif
その時は、今回教えたやり方ではなく、Select Caseで、それぞれの設定の関数に飛ばすやり方にするといいと思うよ。
こんな風にね。

=-=-=-=-=-=-=-=-=-=-
Select Case scene
Case TOTAL_INIT
   TotalInitProc()←こちらで全体的な初期設定を行う
Case TITLE
   TitleProc()
Case GAME_INIT
   GameInitProc()←この関数でゲームスタート時の初期設定を行う
Case GAME
   GameProc()

End Select
=-=-=-=-=-=-=-=-=-=-

n88_kaede.gif
はーい!

n88_reon.gif
それでは今度こそ、今回はここまで。
次回はいよいよ本格的にゲーム作りに入るよ。まず最初は簡単に、追いかけゲームを作ってみようと思います。
お楽しみに!

n88_kaede.gif
また次回です~!



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