2019/03/06

ウインドウ面を使ったゲームを作ってみよう(2)

せっかくなのでカラー対応してみました。

ソース一式はここからダウンロードできます。
gbファイルはここから。

各ファイルの説明は以下の通りです。
make.bat        コンパイル用バッチ
BlackyBirdCol.c メインプログラム
snd_drv.c       サウンドドライバ
snd_drv.h       サウンドドライバ用ヘッダ
snd_data.c      サウンドデータ
bird_bg.c       BG画像データ
bird_spr.c      スプライト画像データ
bird_cloud.c    BG画像データ(雲アニメ用)※今回は実質未使用です

前回、背景の雲の画像をスクロールに合わせて転送して
疑似2重スクロールを行っていましたが、処理が重いので止めました。

カラー化にあたり、いくつか説明します。

set_bkg_palette関数やset_sprite_palette関数を使ってカラーデータを転送します。
画面のフェードを行う際に、フェード段階に合わせたカラーデータを用意しました。
最初はカラーデータを元に計算していましたが、処理が重すぎたので諦めました。

背景のパレット情報はタイルデータと同じようにset_bkg_tiles関数を使って設定します。
set_bkg_tiles関数などタイルデータを設定する関数を実行する前に
VBK_REG = 1 を行うとタイルの代わりにカラーデータを設定してくれます。
終わったらVBK_REG = 0 に戻しておきましょう。

あと、コンパイルのオプションが増えています。

分からない事がありましたら質問して下さい。

ウインドウ面を使ったゲームを作ってみよう(1)

これまでのまとめとして、ウインドウ面を使ったゲームを作ってみました。
ネタがなかったのでFlappyBirdのクローンゲームです。
黒っぽい鳥ということでBlackyBirdです。
ゲーム内容はAボタンで羽ばたきながら土管に当たらないように進んでいくものです。
どこかで見たことのあるような鳥の絵ですが気にしないで下さい。
(※一応、若干変えてあります)

画像データは以下のものをbmp2gbdk.exeで変換しました。
BGの画像(bird_bg.bmp)
スプライトの画像(bird_spr.bmp)

ソース一式はここからダウンロードできます。
gbファイルはここから。

ソースは長いのでダウンロードして確認して下さい。
各ファイルの説明は以下の通りです。
make.bat     コンパイル用バッチ
BlackyBird.c メインプログラム
snd_drv.c    サウンドドライバ
snd_drv.h    サウンドドライバ用ヘッダ
snd_data.c   サウンドデータ
bird_bg.c    BG画像データ
bird_spr.c   スプライト画像データ
bird_cloud.c BG画像データ(雲アニメ用
こんなのです

今回、背景の雲の画像をスクロールに合わせて転送して
疑似2重スクロールを行っていますが、処理が重いみたいです。

サウンドデータを作るツールは諸事情により公開しません。

分からない事がありましたら質問して下さい。

2019/02/10

ウィンドウ面を表示してみよう

ゲームボーイにはBG面の他にウィンドウ面というものがあります。
簡単に説明すると、BGの上に表示できる、もう1枚のBGみたいなものですが
制限が色々あるので使い勝手は微妙なところです。

まず、表示できるタイルデータはBGと共通です。

表示はSHOW_WIN、非表示はHYDE_WINで行います。
表示内容はset_win_tiles()で設定します。
BGみたいにgotoxy()命令やsetchar()命令とか無さそうなので
表示にひと手間かかります。

そして重要なことですが、下のBGを透過させることが出来ません。
透過させるにはウィンドウ面をスクロールさせて
ウィンドウ面の外側にBGを表示させるしかありません。
スクロールにはmove_win(横スクロール位置, 縦スクロール位置)命令を使いますが
ここにも制限があり、横スクロール位置は0~166、縦スクロール位置は0~143でないと
ウィンドウ面は表示されません。
ちなみに横スクロール位置は7ドット左にずれてしまうようですので
画面の左上にピッタリ表示させるにはmove_win(7,0)とする必要があります。
(かといってmove_win(0,0)にしても左上に設定したタイルの右端は
 何故か表示されません…仕様なのかエミュレータのバグなのかは不明です)

これらの制限から考えるに、ウィンドウ面は基本的に
画面の下部や右部にスコアやステータスなどを表示する際に適しています。

ファミコンではラスタースクロールで画面を分割したりしますが
それよりは簡単に実装できます。

2019/01/27

MBC1を使ってROM容量を増やす

ゲームボーイのプログラムROM容量は32Kバイトですが
ちょっと規模の大きいものを作ろうとすると32Kバイトでは足りなくなります。

そこで、MBC1によるバンク切り替えで
32Kバイトより大きな容量を使えるようにします。

バンク切り替えの仕組みですが、プログラム32Kバイトのうち
前半16Kバイトと後半16Kバイトに分けて、
前半は固定し、後半のみを16Kバイト単位で切り替えます。
切り替えるには SWITCH_ROM_MBC1(バンク番号) という
命令を使います。この命令は前半16Kバイトの
プログラム内で実行しなければなりません。

※ここではGBDKのサンプルプログラムを簡素化して紹介しています。

プログラム前半16Kバイト用のプログラムbanktest.cを作成します。

banktest.c
#include <gb.h>
#include <stdio.h>

void bank_1();
void bank_2();
void bank_3();

void bank_fixed()
{
  puts("I'm in fixed ROM");
}

void main()
{
  puts("Program Start...");

  bank_fixed();
  SWITCH_ROM_MBC1(1);
  bank_1();
  SWITCH_ROM_MBC1(2);
  bank_2();
  SWITCH_ROM_MBC1(3);
  bank_3();

  puts("The End...");
}

続いてプログラム後半16Kバイト用のバンク1のプログラムです。

bank_1()が呼ばれると、「I'm in ROM bank 1」と表示されます。

bank_1.c
#include <gb.h>
#include <stdio.h>

void bank_1() /* In ROM bank 1 */
{
  puts("I'm in ROM bank 1");
}

バンク2、3も同様に作ります。

bank_2.c
#include <gb.h>
#include <stdio.h>

void bank_2() /* In ROM bank 2 */
{
  puts("I'm in ROM bank 2");
}

bank_3.c
#include <gb.h>
#include <stdio.h>

void bank_3() /* In ROM bank 3 */
{
  puts("I'm in ROM bank 3");
}

まとめてコンパイルするバッチファイルを用意します。

make.bat
lcc -Wa-l -c -o banktest.o banktest.c
lcc -Wa-l -Wf-bo1 -c -o bank_1.o bank_1.c
lcc -Wa-l -Wf-bo2 -c -o bank_2.o bank_2.c
lcc -Wa-l -Wf-bo3 -c -o bank_3.o bank_3.c
lcc -Wl-m -Wl-yt1 -Wl-yo4 -o banktest.gb banktest.o bank_1.o bank_2.o bank_3.o

コマンドプロンプトからmake.batを実行すると
banktest.gbが出来上がります。

実行結果から、バンク1~3のプログラムが順に実行されたことが確認できます。

MBC1にはプログラムROMのバンク切り替えの他にバッテリーバックアップや
RAMバンクの機能もあるみたいですが、そこまでは調べていません。

BMPファイルを変換するアプリケーション

皆さん、楽しいゲームボーイ開発ライフをお過ごしでしょうか?

ゲームボーイ開発に欠かせないのはタイルデータを作るGBTDです。
GBTDでGBDKのC言語用のタイルデータを出力しないと
プログラムの中にデータを持たせる事が出来ません。

自分で描く分には構いませんが、デザイナーさんに描いてもらう際に
GBTDを使わせるのは正直なところ酷だと思います。

かといって、デザイナーさんから受け取った画像を
GBTDに入力し直すのもかなりの手間です。

そんな事がありましたので、BMPファイルをGBDKの
C言語用タイルデータに変換するアプリケーションを作りました。

BMP2GBDK.C (bmp2gbdk(v1.0).zip)

・使い方
1)
bmp2gbdk.exe を起動します。
2)
アプリケーションのウインドウが開きますので
BMPファイルをドラッグアンドドロップして下さい。
3)
ファイル名に準じたC言語用のソースファイルが生成されます。
例えば、Player.bmpならPlayer.cになります。
内部の変数名もPlayerになります。

・注意
1)
BMPファイルで使用する色数は必ず4色にして下さい。
使用されている色数をチェックし、RGBの各値の合計順に
明るさを判定します。
2)
BMPファイルの縦横ドットサイズは8の倍数にして下さい。
3)
通常は8x8モードで変換しますが、ファイル名に
“_spr”が含まれている場合は8x16モードで変換します。

・免責事項
このアプリケーションを使用する事によって生じた
いかなる損害に対しても作者は一切の責任を負いません。