2019年07月08日

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

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

n88_kaede.gif
楓:どうもこんにちは! 玲音先輩に勧誘されて、この講座を一緒に担当している楓です!

n88_reon.gif
今度は『勧誘』ときたかー。さてさて、今回からは、いよいよシューティングゲームを作っていきますよ! ショットの発射はもちろん、当たり判定もやっていきますので、お楽しみに!

n88_kaede.gif
はーい。さっそく、はじめていきましょー!



~新しい元型と準備です!

n88_reon.gif
さてさて、ここで一つ重要なことがあります。ActiveBasicとDXライブラリの組み合わせでは、なぜか大がかりなプログラムになると、前の元型では正しくコンパイルできなかったり、動かなかったりすることがあるの。だから……。

n88_kaede.gif
前の元型とは違う元型を使う必要があるってことですねっ。

n88_reon.gif
そういうことです。ということで、新しい元型がこちら!

list1907-01.JPG
list1907-02.JPG
list1907-03.JPG
list1907-04.JPG
list1907-05.JPG
list1907-06.JPG

n88_reon.gif
今回は、この元型に色々肉付けしていくことで、ゲームを作っていくよ。よろしくね!

n88_kaede.gif
はーい!

n88_reon.gif
ではまず、準備から始めていこうね。まず、フォルダを作って、その中に、次の素材をダウンロードして入れましょう!

title.jpg
▲ タイトルの画像

gameover.jpg
▲ ゲームオーバー画面の画像

jiki.bmp
▲ 自機の画像

shot.bmp
▲ ショットの画像

enemy.bmp
▲ 敵機の画像

tekitama.bmp
▲ 敵弾の画像

n88_reon.gif
そしたら続いて、ActiveBasicを起動し、先ほどの元型のプログラムリストを打ち込みます。出来上がったら、同じフォルダに、適当な名前をつけて保存してね。それで準備完了だよ!

n88_kaede.gif
おーー!!

~新元型の解説だよ!

n88_reon.gif
さてここで、この元型の説明をするね。まずは、関数Main。これはその名前の通り、主な処理を行う関数だよ。ここは基本的には、特にいじることはありません。

n88_kaede.gif
ふむふむ。

n88_reon.gif
DxInit関数とDxEnd関数も、特にいじることはないよ。私たちが処理を書いていくのは、そのほかの、AppInit、MaterialLoad、Title、PlayInit、StageInit、GameMain、GameClear、Miss、GameOverの9つの関数。まずは、AppInit関数から説明していくね。

n88_kaede.gif
はーいっ。

n88_reon.gif
これは、ゲームを起動したときに行う処理をする関数。例えば、ハイスコアを初期化したりとかね。

n88_kaede.gif
ふむふむ。

n88_reon.gif
次はMaterialLoad関数。これは、その名前の通り、画像やBGM、効果音などの素材を読み込む処理を書く関数だよ。

n88_kaede.gif
次のTitle関数は、タイトル画面を出したり、キーを押したらゲームをスタートしたりなどの、タイトル画面についての処理を書くところですよね。

n88_reon.gif
うん、そのとおり。その後のPlayInitは、ゲームスタート時の初期処理、StageInitは各ステージ開始時の処理を書く関数だよ。

n88_kaede.gif
その後のGameClear、Miss、GameOverはそれぞれ、ゲームやステージをクリアした時、ミスした時、ゲームオーバーになった時の処理を書く関数ですねっ。

n88_reon.gif
うん、正解っ。その通りっ。さて、次回からはいよいよプログラムを書いていくよ。まず次回は、自機の移動やショットの発射処理を書いていきます。お楽しみにねっ。

n88_kaede.gif
また次回~。



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

2019年06月10日

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

n88_reon.gif
玲音:どうもこんにちは! B-Maga編集部の紅一点、玲音です!

n88_kaede.gif
楓:こんにちは! その玲音先輩に講座に引きずり込まれた楓です!
ところで先輩、編集部には妹弟子Aちゃんもいるし、私もいますから、紅一点というのはおかしいんじゃ……

n88_reon.gif
わーわー! 楓ちゃん、それを言ったらダメだよ!
それに、引きずり込んだなんて、人聞きが悪いってばっ。

n88_kaede.gif
えへへ……。それじゃ先輩、今回もいってみましょうか。

n88_reon.gif
う、うん、そうだね。
こほん、今回は、スピードの調節の方法、追いかけゲームでSgnをどうやって使ってるか、そして敵とぶつかった判定をやっていくよっ。

~dxWaitTimerでスピードを調節しよう!~

n88_reon.gif
さてさて、まずはスピードを調節する方法ですが、それにはdxWaitTimer関数を使いまーすっ。

n88_kaede.gif
dxWaitTimerですかー。

n88_reon.gif
うん。さっそく使ってみるよ。サブプロシージャGameProc()の中の、End Subの前当たりに、次の一行を入れてみて。

abdx1906-a01.JPG

abdx1906-p01.JPG
▲ 入れた後のGameProcはこうなります。

n88_reon.gif
入れてみたら、さっそく動かしてみてね。どうかな?

n88_kaede.gif
あっ、ちょうどいいスピードになっています! これぐらいなら遊べそうです!

n88_reon.gif
良かった良かった。さて、このdxWaitTimerは、指定された時間、プログラムの動きを止める関数なの。止める時間は、( )の中の引数で指定できるよ。ちなみに単位はミリ秒単位ね。

n88_kaede.gif
ミリ秒単位?

n88_reon.gif
うん。1/1000秒をミリ秒というんだよ。つまり、今回の場合だったら、一回の処理が終わるたびに、100ミリ秒……つまり、0.1秒の間、時間を止めてるわけ。

n88_kaede.gif
なるほどー。

~Sgn関数をどう使う?~
n88_reon.gif
さて、Sgn関数だけど、これは( )の中が0より大きければ+1、小さかったら-1を返す関数だってことは、前回話したよね。

n88_kaede.gif
はいっ。それで、これをどう使ってるんですか?

n88_reon.gif
その前に前提として、例えばX座標の場合、自分が敵の右にいれば左に、自分が敵の左にいれば右に移動しなきゃいけないことを踏まえておこう。これを言い換えれば、自分のXが敵のXより大きければ左に移動する、つまり-1をXに加える。逆に、自分のXが敵のより小さければ右に移動、つまり+1を加える、ってことになるよね。

n88_kaede.gif
はい、そうですねっ。

n88_reon.gif
では論より証拠。この図を見てねっ。

abdx1906-i01.JPG

n88_kaede.gif
おおーー。見事にSgnの値が、先輩の言っていた前提の通りになってますっ。これで、逃げるような動きにできたんですねっ。

n88_reon.gif
うん。ちなみに、式を逆にすると、敵が自分を追いかけるようになるよ。やってみてね。

n88_kaede.gif
はーいっ。

~完成っ~
n88_reon.gif
さて、最後は、自分が敵を捕まえたかどうかの判定だけど、これは簡単。敵のXとYが、自分のそれと同じになったかどうかをチェックすればOKだよ。

n88_kaede.gif
なるほどっ。それじゃ、さっそく入れてみましょうー。

n88_reon.gif
うん。だけどその前に、捕まえるのにどれだけの時間がかかったかをカウントする処理も入れちゃおう。
まず、プログラムの上の、Dim文がたくさん並んでいるところに、次の一行を追加して。

abdx1906-a02.JPG

abdx1906-p02.JPG
▲ 入れた後はこうなりました。

n88_reon.gif
それができたら、続いて、サブプロシージャGameProcの、さっき入れたdxWaitTimerのすぐ上に、次の一行を入れてね。

abdx1906-a03.JPG

abdx1906-p03.JPG
▲ 入れた後のGameProc

n88_reon.gif
やってることはいたって簡単。自分と敵の処理が終わるたびに、変数scに1を加算してるだけ。

n88_kaede.gif
ふむふむ。

n88_reon.gif
さて、ここまでできたら、いよいよ当たったかどうかの判定と、捕まえたときの処理だけだね。まず判定だけど、これはさっきも言った通り、自分のXとYが、敵のそれと同じかどうか調べるだけでOK。もし同じであれば、変数sceneに定数GAMEOVERを入れてゲームオーバーにうつす、と。
というわけだから、判定はこうなるよ。

abdx1906-a04.JPG

abdx1906-p04.JPG
▲ 入れた後のMoveMyCharaはこうなるよ


n88_reon.gif
そして最後に、ゲームオーバーの処理ね。まず、Dim文がたくさん並んでる最初のほうに、次のコードを書いてね。ここでは、ゲームオーバー画面用のハンドルを入れる変数を宣言してるよ。

abdx1906-a05.JPG

abdx1906-p05.JPG
▲ 入れた後

n88_reon.gif
さらに、サブプロシージャInitProcに、次のコードを書いてね。

abdx1906-a06.JPG

abdx1906-p06.JPG
▲ 入れた後のInitProcはこうなります

n88_kaede.gif
ゲームオーバーの画像を読み込み、ハンドルを、変数hndOverに格納してるんですね。

n88_reon.gif
うん、その通りだよ。さて、サブプロシージャOverProcの、Sub OverProc()とEnd Subの間に、次のコードを書いてね。

abdx1906-a07.JPG

abdx1906-p07.JPG
▲ 入れた後のOverProc

n88_reon.gif
ここでやってるのも簡単。ゲームオーバーの画面を出して、dxDrawFormatStringでかかった時間を表示させてるだけ。
これで完成だよ!

n88_kaede.gif
わーい、やったー!

n88_reon.gif
できたけど、ここで一つ課題を。今のプログラムでは、捕まえたらそのまま止まったままだけど、これを一定時間が過ぎたらタイトル画面にうつるようにしてみよう。それと、色々改良もしてみちゃおう!

n88_kaede.gif
はーい。頑張ります!

n88_reon.gif
それでは次回は、いよいよシューティングゲーム編にうつるよ。お楽しみに!



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

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ゲーム』の予定です。お楽しみに!

2019年04月09日

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

n88_reon.gif
さてさて、今日からいよいよ本格的なゲーム作りをやってみようと思います!

n88_kaede.gif
はーい!

n88_reon.gif
まず最初、追いかけゲームを作ってみようと思います。こんな感じのゲームだよ。

abdx1904-g01.jpg

n88_reon.gif
このように、敵を捕まえるゲーム。これを作るのが今回の目標です!


n88_kaede.gif
わかりましたー! それではさっそく初めていきましょー!


~まずは……

n88_reon.gif
まずは準備を始めていこうか。適当なフォルダを作って、そこにDxLibDll.dllとDxLib.sbpをコピーしておいて。詳しいやり方は、Windowsの操作について説明しているサイトがあるから、それを探して、読んでみてね。

n88_kaede.gif
わかりました。……よし、できましたよー。

n88_reon.gif

それでは次に、ActiveBasicを開いて、次のコードを打ち込んで。ちなみにこれは、第4回で作った、プログラムの骨組みだよ。

abdx1904-l01.jpg

n88_reon.gif
打ちこんだら、それをこれまた適当な名前で、さっき作ったフォルダに保存しておいてね。そうそう、保存するには、画面の上のほうにある、フロッピーがたくさん重なったアイコンのボタンを押すんだよ。

abdx1904-g02.jpg

n88_kaede.gif
できましたー。

n88_reon.gif
うんうん。さて、これからプログラムを作るときは、このフォルダをコピーして、フォルダの名前と、プログラムの名前を変更して使うことにします。そうすれば、いちいちあのプログラムを打ち込んだりしなくてもいいでしょ。

n88_kaede.gif
なるほどー。

n88_reon.gif
さてさて、それでは、さっそくこの元型を使って、ゲームを作りましょうー!

~まずはコピーと名前の変更だ

n88_reon.gif
さて、まずはさっき作ったりなんだりしたフォルダをコピーしましょうー

n88_kaede.gif
はい、コピーしました、先輩っ。

n88_reon.gif
そしたらまずは、コピーしたフォルダの名前を変えよう。えーと……今回は、『oikake』にしておこうか。

abdx1904-g03.JPG

n88_kaede.gif
できましたっ。次はどうするんですか?

abdx1904-g04.JPG

n88_reon.gif
続いて、コピーしたフォルダの中の、DxLib.sbpではないほうのプログラムの名前を変更します。こちらも名前は『oikake.abp』としておきましょう。

abdx1904-g05.JPG
abdx1904-g06.JPG

n88_reon.gif
続いて、作業するフォルダの中に、次の素材を入れてね。

1904title.jpg
※title.jpg という名前で保存

1904player.png
※player.png という名前で保存

1904teki.png
※teki.png という名前で保存

1904over.png
※over.jpg という名前で保存

n88_reon.gif
これで準備はOK。いよいよプログラミングだよ!

n88_kaede.gif
おー!

~タイトルを出してみよう!


n88_reon.gif
それでは、まずはタイトルの表示からやってみようか。

n88_kaede.gif
はーい! まず、
Dim scene As Integer
の下に、
Dim hndTitle As Long
を追加しまーす!

abdx1904-l03.JPG

n88_kaede.gif
この変数hndTitleは、タイトル画面のハンドルを格納する変数ですっ。
ハンドルが何かは、過去の記事を読んでくださいねっ。

n88_reon.gif
ちょっとした宣伝ありがとう。それじゃ次は?

n88_kaede.gif
はいっ。続いて、サブプロシージャInitProcに、次のコードを書きますっ。
赤い枠で囲んだのが、新しく書いたコードですっ。

abdx1904-l04.JPG

n88_kaede.gif
この命令は、画像title.jpgを読み込んで、そのハンドルを変数hndTitleに格納するものですっ。
そして続いて、サブプロシージャTitleProcに次のコードを書きますっ。

abdx1904-l05.JPG
※赤枠、青枠で囲んだ部分が、書いたコード

n88_kaede.gif
まず、赤枠で囲んだ部分は、hndTitleに格納したハンドルの画像……つまり、読み込んだtitle.jpgを表示させる命令、そして青枠で囲んだ部分が、スペースキーが押されたら、変数sceneに定数GAMEを入れる……つまり、ゲームのメインに移行させる、というものです。

n88_reon.gif
はい、よくできました。それじゃ、今回はここまでにしておこうか。
次回は、キャラクターの操作、そして敵キャラの移動についてやっていくよ。お楽しみに!

n88_kaede.gif
また次回です~!


=-=-=-=-=-=-=-=-=-=-

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

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ゲーム!』の予定です。お楽しみに!