Mac OS X で GBA ゲームを作る (3)

今回は、前回ビルドしたコードのちょっとした解説です。

このコードは以下のようになっています。

#include <gba_console.h>
#include <gba_video.h>
#include <gba_interrupt.h>
#include <gba_systemcalls.h>
#include <gba_input.h>
#include <stdio.h>
#include <stdlib.h>

//---------------------------------------------------------------------------------
// Program entry point
//---------------------------------------------------------------------------------
int main(void) {
//---------------------------------------------------------------------------------


	// the vblank interrupt must be enabled for VBlankIntrWait() to work
	// since the default dispatcher handles the bios flags no vblank handler
	// is required
	irqInit();
	irqEnable(IRQ_VBLANK);

	consoleDemoInit();

	// ansi escape sequence to set print co-ordinates
	// /x1b[line;columnH
	iprintf("\x1b[10;10HHello World!\n");

	while (1) {
		VBlankIntrWait();
	}
}

いくつか見慣れない関数が呼ばれています。一つずつ見ていきます。

  1. irqInit
    1. IRQ ( Interrupt ReQuest )、即ち割り込み要求の初期化
    2. gba_interrupt.h を include し、libgba.a をリンクすると実行可能になる
  2. irqEnable
    1. 指定した IRQ を有効化する
    2. gba_interrupt.h を include し、libgba.a をリンクすると実行可能になる
  3. consoleDemoInit
    1. consoleInit の簡易版
    2. コンソール画面の初期化に使う
    3. テストプログラムなどを作るときに活躍する
    4. gba_console.h を include し、libgba.a をリンクすると実行可能になる
  4. iprintf
    1. コンソールに文字を出力する
    2. x1b という見慣れないエスケープシーケンスがあるが、これは GBA 固有ではなく一般的なもの
    3. [line;columnHとしてやると、カーソル位置を ( line, column ) に移動する
    4. http://edu.inf.shizuoka.ac.jp/lecture/2010/A041/text/escape_sequence.html
  5. VBlankIntrWait
    1. 画面の垂直同期待ちを行う
    2. ちらつきのない表示を行うためには不可欠となる

この辺が網羅されたリファレンスを少し探してみたが GBA 用のものが見当たらなかった。近いものとして NDS 用のものがある。

自分で説明書いてて思いましたが、こう書いてもよく分かりませんね。それならそれで問題ないです。そのうちなんとなく分かります。GBA ってこんなもんなんだな、ってことが。

割り込み、画面の垂直同期待ちあたりは、馴染みのない人もいるかもしれません。以下のサイトで詳しく説明されています。

GBA プログラミングでは、割り込みは必ず出てきますが、大体決まった書き方をするだけなのであまり恐れることはありません。ちなみに、割り込みをうまく利用すると F-ZEROマリオカートであるような擬似 3D 効果を表現できます。