
マイケル
みなさんこんにちは!
マイケルです!
マイケルです!

エレキベア
こんにちクマ〜〜

マイケル
今日は前回に引き続き、GBDKを使ったゲームボーイソフト制作
を進めていくよ!
を進めていくよ!

マイケル
第2回ということで、お待ちかね ゲーム制作編 です!

エレキベア
楽しみクマ〜〜〜
どんなゲームを作るクマ??
どんなゲームを作るクマ??

マイケル
ゲームボーイのタイルを並べる画面構成に合わせて、
簡単な 倉庫番ゲーム を作ろうと思うよ!
完成品としては以下のような感じだ!
簡単な 倉庫番ゲーム を作ろうと思うよ!
完成品としては以下のような感じだ!
↑制作する倉庫番ゲーム

マイケル
頑張ってマップの自動生成処理も入れてみたんだけど、
そこは次回に回して、メイン処理の部分だけざっと紹介します!
そこは次回に回して、メイン処理の部分だけざっと紹介します!

エレキベア
わりと本格的クマね〜〜

マイケル
一通り遊べるようにはしたんだ!
ソースはGitHubにアップしてあるので、自由に使ってください。
ソースはGitHubにアップしてあるので、自由に使ってください。

エレキベア
(エンジニアっぽいクマ・・・)

マイケル
それでは早速やっていこう!
GBDKの基本操作

マイケル
ゲーム制作に入る前に、軽くゲームボーイの仕様と
GBDKの基本操作を確認しておきましょう!
GBDKの基本操作を確認しておきましょう!
画像の表示方法

マイケル
まず画像の表示ですが、ゲームボーイでは下記のように
8*8pxを1タイル として表示します。
そしてタイルを描画できる全体の領域は 256*256px ですが、
画面に表示できる範囲は 160*144px の範囲になります。
8*8pxを1タイル として表示します。
そしてタイルを描画できる全体の領域は 256*256px ですが、
画面に表示できる範囲は 160*144px の範囲になります。
↑8*8px を1タイルとして表示、画面表示領域は160*144px

エレキベア
このタイル単位でしか描画できないクマね

マイケル
用意した画像をタイルとして事前に登録しておくことで、
指定して描画できるようになるわけだね!
指定して描画できるようになるわけだね!
タイル画像の作成

マイケル
タイル画像を表示するには、16ビットのデータに変換してソースファイルに記述
しなければいけません。
GBTD というツールを使えば簡単に変換できるようなので、こちらを使用します。
しなければいけません。
GBTD というツールを使えば簡単に変換できるようなので、こちらを使用します。
※Windows専用

マイケル
ツールを使って下記のように適当に書いたら、
C言語のソースファイルとして出力します。
C言語のソースファイルとして出力します。
↑タイルを描く
↑C言語のソースファイルとして出力(ラベル名は任意)
↑出力されたファイル

マイケル
このように出力されればオーケーです!
このソースを使って表示していきましょう!
このソースを使って表示していきましょう!

エレキベア
やったるクマ〜〜〜
タイル画像の描画

マイケル
それではタイル画像を描画してみましょう!
手順としては タイル画像を登録して表示する 流れになります。
手順としては タイル画像を登録して表示する 流れになります。

マイケル
登録できるタイルには下記の3種類があります。
・BG(背景の表示に使用)
・ウィンドウ(メッセージ等の表示に使用。背景の上に表示できる。)
・スプライト(キャラクター等の表示に使用。重ねたりできる。)
・BG(背景の表示に使用)
・ウィンドウ(メッセージ等の表示に使用。背景の上に表示できる。)
・スプライト(キャラクター等の表示に使用。重ねたりできる。)
今回作るゲームは背景表示の切り替えだけでゲームが実現できそうなので、
BGのタイルとして登録して使用 しましょう。

エレキベア
いろんな種類があるクマね

マイケル
BGタイルとして登録するため、
まずは出力したファイルを下記のように修正しましょう!
まずは出力したファイルを下記のように修正しましょう!
↑タイル情報の修正

マイケル
BGは 最初のタイルがデフォルトで全領域に表示される ようなので、
頭に 白背景(全て0x00)を挿入 します。
登録したタイルは、16ビットごとに0x00、0x01、0x02〜と番号が振られて使用できる ようになります。
頭に 白背景(全て0x00)を挿入 します。
登録したタイルは、16ビットごとに0x00、0x01、0x02〜と番号が振られて使用できる ようになります。

マイケル
ソースを修正して読み込んだら、下記のように記述してタイル画像を描画できます!
↑タイル画像の描画
↑実行結果

エレキベア
表示の仕方は大体分かったクマ〜〜

マイケル
続けてボタンの入力操作を見ていこう!
ボタン入力

マイケル
ボタンの入力は、 joypad() より取得します!
下記のように記述することで検知することができます!
下記のように記述することで検知することができます!
↑ボタン入力の検知
↑ボタン入力に応じて移動する

エレキベア
動いたクマ〜〜〜

マイケル
これで基本操作は押さえたので、
ゲーム制作にとりかかっていきましょう!
ゲーム制作にとりかかっていきましょう!
倉庫番ゲームの制作

マイケル
それでは、冒頭でお見せした倉庫番ゲームを作っていきます!
こちらは全部で3つのソースファイルで構成されています!
こちらは全部で3つのソースファイルで構成されています!
↑倉庫番ゲームのファイル構成

エレキベア
シンプルで分かりやすいクマ

マイケル
それぞれのファイルの内容について、
・BGタイルの定義
・マップの定義
・メイン処理
の順番で解説していきます!
・BGタイルの定義
・マップの定義
・メイン処理
の順番で解説していきます!
BGタイルの定義

マイケル
まずはBGタイルの定義!
こちらはGBTDツールで下記4枚の画像を作成し、定義しています!
こちらはGBTDツールで下記4枚の画像を作成し、定義しています!
↑ブロック(8*8px)
↑ボックス(16*16px)
↑プレイヤー(16*16px)
↑ポイント(16*16px)

マイケル
今回作るゲームは、基本的に16*16を1タイルとして扱う ため、
4つのデータを1つの配列としてまとめました!
4つのデータを1つの配列としてまとめました!
↑タイルの定義

エレキベア
作った画像をこんな感じの配列にまとめたら
番号が割り振られるクマね
番号が割り振られるクマね

マイケル
ちなみにマップ用のタイル番号 については、
この後解説するマップで扱う定数になります!
この後解説するマップで扱う定数になります!
マップの定義

マイケル
次はマップの定義についてです!
先ほど書いた通り今回のゲームでは 16*16を1タイルとして扱うため、
マップ全体を10*9の配列として定義 しています!
先ほど書いた通り今回のゲームでは 16*16を1タイルとして扱うため、
マップ全体を10*9の配列として定義 しています!

マイケル
この時、タイルの定義で記述した定数(ブロックは1、プレイヤーは2など)
を使って、マップを表現しています!
を使って、マップを表現しています!

マイケル
例えば、下記のようなマップだとこのような配列になります。
↑上記マップを表した配列

マイケル
なおマップ配列の自動生成処理の解説については、
長くなってしまうため次回に持ちこそうと思います…。
長くなってしまうため次回に持ちこそうと思います…。

エレキベア
そっちも楽しみクマね
メイン処理

マイケル
そして最後にメイン処理!
準備したタイル、マップの定義を使ってゲームを実装しています!
準備したタイル、マップの定義を使ってゲームを実装しています!

マイケル
全体の処理としては下記になります。
↑倉庫番ゲームメイン処理

エレキベア
長くてわからんクマ・・・

マイケル
少しずつ分けて見ていきましょう!
タイトル画面の表示

マイケル
まずはタイトル画面の表示!
事前に用意したタイトル画面のマップを表示してボタンの入力検知を行なっています。
事前に用意したタイトル画面のマップを表示してボタンの入力検知を行なっています。
↑タイトル画面表示処理
↑タイトル画面

マイケル
ほんとは文字も画像として用意した方がいいんだろうけど、
面倒臭いのでブロックで無理やり書きました・・・。
面倒臭いのでブロックで無理やり書きました・・・。

エレキベア
(適当クマ・・・・。)

マイケル
ちなみにマップの自動生成処理の際に乱数取得を行うため、
ボタン入力までの時間を利用して乱数シードの設定 も行なっています!
こちらは次回みていきましょう!
ボタン入力までの時間を利用して乱数シードの設定 も行なっています!
こちらは次回みていきましょう!

エレキベア
ゲームボーイだと時刻機能も無いから
そういう工夫が必要なのクマね・・・
そういう工夫が必要なのクマね・・・
マップの描画処理

マイケル
タイトル画面でボタンが押下されたら次はマップ生成処理!
・・・なのですが、こちらの自動生成処理は次回解説します。
・・・なのですが、こちらの自動生成処理は次回解説します。
↑マップ生成処理

エレキベア
(気になるクマ・・・。)
プレイヤーを動かす処理

マイケル
そして次はメインとなるプレイヤー移動処理!
押下されたボタンに応じてマップを移動するようにしています!
押下されたボタンに応じてマップを移動するようにしています!
↑プレイヤー移動処理

マイケル
移動先がブロックの場合には移動しない等、
細かいチェックも入れています!
細かいチェックも入れています!

エレキベア
マップ配列を使って移動処理を行なっているクマね
ボックスを動かす処理

マイケル
そして倉庫番ゲームということで、移動後の位置にボックスがあったら動かさなければなりません。
そちらの判定は下記のように実装しています!
そちらの判定は下記のように実装しています!
↑ボックス移動処理

マイケル
プレイヤーとボックスのどちらも移動が可能かを
判定する必要があることに注意です!
判定する必要があることに注意です!

エレキベア
これで基本的な動きはできるようになったクマね
クリア画面の表示

マイケル
最後はゲームクリア処理!
マップ上にボックスが無くなったことを検知したら下記処理に遷移します!
マップ上にボックスが無くなったことを検知したら下記処理に遷移します!
↑クリア画面の表示

マイケル
こちらもタイトル画面と同じく、
用意したマップ配列を表示しているだけですね!
用意したマップ配列を表示しているだけですね!

エレキベア
これで完成クマ〜〜〜!!!
おわりに

マイケル
というわけで以上が倉庫番ゲームの解説でした!
どうだったかな?
どうだったかな?

エレキベア
小さなところから作っていけば案外難しくなかったクマ

マイケル
使い方さえ覚えてしまえば案外いけるし、
制限がある分、逆に悩まなくて済むというのもあるよね。
制限がある分、逆に悩まなくて済むというのもあるよね。

マイケル
ただ個人的にはC言語が書き慣れておらず、
オブジェクト指向感覚で書いてるといろいろ苦戦しました・・・。
(コードが汚く申し訳ないです・・・。)
オブジェクト指向感覚で書いてるといろいろ苦戦しました・・・。
(コードが汚く申し訳ないです・・・。)

エレキベア
今ほど便利じゃないからいろいろ困るクマね・・・

マイケル
でもまあとりあえずゲームは完成したので、次回はいよいよ実機実行!
・・・の前に、マップの自動生成処理の解説だけちょこっと挟もうと思います。
・・・の前に、マップの自動生成処理の解説だけちょこっと挟もうと思います。

エレキベア
第2.5回ってところクマね

マイケル
それでは今日はこの辺で!
アデュー!!
アデュー!!

エレキベア
クマ〜〜〜〜〜〜
【GBDK】第二回 自作ゲームボーイソフトを作ろう! 〜ゲーム制作編「倉庫番」〜 〜完〜
※続きはこちら