ゲームボーイ SDK である GBDK を使ってオリジナルゲームを作ろうとしている様子をブログで公開しています。準備編とハローワールドの前回のはこちらです:
GBDK でゲームボーイのオリジナルゲームを作る(0)


今回はゲームに必須の「ボタン操作」を実装してみます。方向キーで動く方向を指示したり、SELECT したり START したり、「はい/いいえ」を選んだり、という操作で必要になるであろう各種ボタン操作のハンドリングを行います。環境構築を含めた GBDK のセットアップ方法については前回のエントリを参照してください。


【ボタン操作の認識】
今回作ろうとしているモールモールではややこしいグラフィック操作を行うつもりはありませんが、ゲームボーイで操作する以上は「START ボタンで始まって、方向キーで動かして、Aボタンで先に進んで、・・」といったボタン操作は避けて通ることができません。というわけで今回はボタン操作を実装しました。ソースコード(keys.c)はこんな感じ、前回から加えた部分を青字にしています:
#include <gb/gb.h>
#include <stdint.h>
#include <stdio.h>

void main( void ){
    uint8_t key;

    printf( "Hello World!\n" );

    CRITICAL {
        add_SIO(nowait_int_handler);
    }
    set_interrupts(SIO_IFLAG);

    while( 1 ) {
        key = waitpad( J_A | J_B | J_START | J_SELECT | J_UP | J_DOWN | J_LEFT | J_RIGHT );
        waitpadup();

        if( key == J_A ){
            // A Button
            printf( "A" );
        }else if( key == J_B ){
            // B Button
            printf( "B" );
        }else if( key == J_START ){
            // START Button
            printf( "START" );
        }else if( key == J_SELECT ) {
            // SELECT Button
            printf( "SELECT" );
        }else if( key == J_UP ) {
            // UP Button
            printf( "UP" );
        }else if( key == J_DOWN ) {
            // DOWN Button
            printf( "DOWN" );
        }else if( key == J_LEFT ) {
            // LEFT Button
            printf( "LEFT" );
        }else if( key == J_RIGHT ) {
            // RIGHT Button
            printf( "RIGHT" );
        }
        printf( "\n" );

        /* In case of user cancellation */
        waitpadup();
    }
}

waitpad() という関数でキー入力を取得します。その際に特定種類のキー入力だけを取得したい場合は waitpad() 関数の引数に対象キー(のビット和)を指定します(上の例では全てのキーを対象にしています)。そして if 文で入力されたキーを識別して、入力されたキーを printf で表示する、という内容です。この一連の処理を while で無限ループにしています。 また("Hello World!" 部分も含めて)1行ずつ表示したいので、printf の最後に "\n" を入れて1回ずつ改行するようにしています。

この keys.c をビルドします。前回同様、Windows の場合は compile.bat を、macOS や Linux の場合は Makefile を用意し、それぞれ "compile.bat" と "make" を実行して keys.gb をビルドします:
(compile.bat)
c:\MyApps\gbdk\bin\lcc -Wa-l -Wl-m -Wl-j -o keys.gb keys.c

(Makefile)
CC	= ~/gbdk/bin/lcc -Wa-l -Wl-m -Wl-j

BINS	= keys.gb

all:	$(BINS)

# Compile and link single file in one pass
%.gb:	%.c
	$(CC) -o $@ $<

clean:
	rm -f *.o *.lst *.map *.gb *~ *.rel *.cdb *.ihx *.lnk *.sym *.asm *.noi

成功すると keys.gb という ROM ファイルができあがります。ゲームボーイエミュレータを起動して同ファイルを読み込むと、入力したキーの内容がそのまま画面に出力されるのが確認できます(動作している様子のスクリーン動画を撮ってみました):


(↑有名なコナミコマンドを入力してみました)


キー入力を識別できるようになったので、次回は「キャラクターを動かす」ことに挑戦する予定です。