GBDKによるゲームボーイソフト制作-5回 背景を動かす-

前回:GBDKによるゲームボーイソフト制作-4回 背景表示-
次回:まだ

背景を動かしてみる

第3回のキー入力と前回との合わせ技で、十字キーの横入力に応じて背景を横に動かしてみる。

ソースコード

前回のものをこんな感じに改造。

main.c
#include <gb/gb.h>
#include <gb/drawing.h>
#include "tiles.c"
#include "image.c"

void main() {
    UINT8 pad, pos_x, pos_y;

    pos_x = 0;
    pos_y = 0;

    HIDE_BKG;   // 背景非表示
    set_bkg_data(0, 1, g_tiles);
    set_bkg_tiles(0, 0, 40, 18, g_image);
    move_bkg(pos_x, pos_y);
    SHOW_BKG;   // 背景表示

    while (1) {

        wait_vbl_done();    // 画面更新を待つ
        pad = joypad();     // キー入力状況の取得

        if (pad & J_LEFT) {
            pos_x -= 1;
        }

        if (pad & J_RIGHT) {
            pos_x += 1;
        }
        move_bkg(pos_x, pos_y);
    }
}

解説

7行目 変数宣言

UINT8(8bit符号なし整数)型の変数を3つ定義。
それぞれキー入力取得用、背景座標X、背景座標Y(今回は常に0)。

15行目 move_bkg

現在の背景を指定した座標に移動させる。
前回は明示的に指定しなかったが、デフォルトは0,0のようなのでとりあえず初期はデフォ値にしておく。

20行目 wait_vbl_done

以前にwhileを扱った時はこの関数は使っていなかった。
これは何をしてるかというと、画面の更新を待つことで以降の処理を意図的に遅延させている。
私たちが普段使うPCもモニタは一定の速度(一般的なものは60回/秒)で画面を更新していて、ゲームボーイもそれは同様の仕組みとなっている。
画面更新を無視して裏側の処理を行うと処理速度が安定しなかったりする。
それを避けるため、ループ内の処理の実行を1回の画面更新につき1回に合わせている。
(大体こんな感じだと思います。間違ってたらごめんなさい。)
詳しくは「垂直同期」などでググると良い。

21~30行目

この辺りは以前のキー入力のプログラムと同様で、joypad関数で受け取った結果のJ_RIGHTまたはJ_LEFTのビットが立っているかチェックし、立っていればそれぞれに応じてmove_bkgでX座標を変化させている。

コンパイル

前回と同様。
コマンドプロンプトでソースファイルのあるディレクトリにcdして、
lcc -o game.gb main.c
※ROMファイルを"game.gb"、ソースファイルを"main.c"とした場合

実行結果

result.png
こればかりは実際に動かしてみないとよくわからない。
十字キー左右に対応するキーを押すことで画面が動く。
動かしてみると背景がループしていると思うが、どうやらデフォルトでリピートするらしい。

ということで今回はここまでです。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.