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)にしても左上に設定したタイルの右端は
 何故か表示されません…仕様なのかエミュレータのバグなのかは不明です)

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

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