GBDKで何か作ってみる。(1)

今年も残すは師走のみという手前で、
表立った創作活動を全くして来てない事に気付く。


本当はまたGBA用にミニゲームでも自作しようかと考えていたのだが
先のゲームレジェンド29でCUBIC STYLEさんがGB用に新作ハードをリリースされていたので、
ならば合わせで何かGBプログラムでも一丁作ってみようかと思った次第。


まだ触れていないハードとして常々やってみたいと思っていたので丁度良いかなと。


で、ざっくり付属ドキュメントやら現存する日本語情報やらを見て回ったが、、
GBで出来ることが大体ライブラリとして整備されているものの、
どうも必要最低限といった具合で効率良く開発するには不足な感じが否めない。


取り急ぎキー入力の押離判定だけでも何とかしたかったので、
devkitProのlibgbaやlibndsライブラリと同じように扱えるラッパー関数をこさえてみた。


…来月あまり自由に使えそうな日が無いけど、コミケまでには間に合わせたいなぁ。


keys.c

#include <gb/gb.h>

//------------------------------------------------------------------------------

static UBYTE keys = 0;
static UBYTE keysold = 0;
static UBYTE keysrepeat = 0;

static UBYTE wait = 30, repeat = 15, count = 30;

//---------------------------------------------------------------------------
UBYTE keysHeld(void) {
//---------------------------------------------------------------------------
	return keys;
}

//---------------------------------------------------------------------------
UBYTE keysDown(void) {
//---------------------------------------------------------------------------
	return (keys &~ keysold);
}

//---------------------------------------------------------------------------
UBYTE keysDownRepeat(void) {
//---------------------------------------------------------------------------
	UBYTE tmp = keysrepeat;
	
	keysrepeat = 0;
	
	return tmp;
}

//---------------------------------------------------------------------------
void keysSetRepeat(UBYTE setWait, UBYTE setRepeat) {
//---------------------------------------------------------------------------
	wait = setWait;
	repeat = setRepeat;
	count = wait;
	keysrepeat = 0;
}

//---------------------------------------------------------------------------
UBYTE keysUp(void) {
//---------------------------------------------------------------------------
	return (keys ^ keysold) & (~keys);
}

//---------------------------------------------------------------------------
UBYTE keysCurrent(void) {
//---------------------------------------------------------------------------
	return keys;
}

//---------------------------------------------------------------------------
void scanKeys(void) {
//---------------------------------------------------------------------------
	keysold = keys;
	keys = joypad();
	
	if (wait != 0) {
		if (keys != keysold) {
			count = wait;
			keysrepeat = keysDown();
		}
		count--;
		if (count == 0) {
			count = repeat;
			keysrepeat = keys;
		}
	}
}


main.c

#include <stdio.h>
#include "keys.c"

//---------------------------------------------------------------------------
void main(void) {
//---------------------------------------------------------------------------
	puts("keys library test");
	puts("USAGE:");
	puts("J_UP:keysUp");
	puts("J_DOWN:keysDown");
	puts("J_LEFT:keysHeld");
	puts("J_RIGHT:keysCurrent");
	puts("J_START:keysDownRepeat");
	
	keysSetRepeat(60, 30);
	
	while(1) {
		scanKeys();
		
		if(keysUp() & J_UP) {
			puts("J_UP:KeysUp");
		}
		if(keysDown() & J_DOWN) {
			puts("J_DOWN:KeysDown");
		}
		if(keysHeld() & J_LEFT) {
			puts("J_LEFT:KeysHeld");
		}
		if(keysCurrent() & J_RIGHT) {
			puts("J_RIGHT:KeysCurrent");
		}
		if(keysDownRepeat() & J_START) {
			puts("J_START:KeysDownRepeat");
		}
		
		wait_vbl_done();
	}
}