BG面をスクロールしてみる

■ 文字表示に使ったライブラリを改めて調べてみる

ライブラリの仕様は、vdp_bg.hに書かれています。

void VDP_drawText(const char *str, u16 x, u16 y)
VDP_PLAN_Aのx,yの位置から文字列を書き込みます。

ドキュメントを見ると似たような関数がありますね。

void VDP_drawTextBG(u16 plan, const char * str, u16 flags, u16 x, u16 y)
第一引数にはVDP_PLAN_AかVDP_PLAN_Bを指定します。flagsにはTILE_ATTR()マクロを使って値を指定します。

なるほど、VDP_drawTextBG()の方が多機能なのですね。

TILE_ATTR()マクロはvdp_tile.hで定義されています。

#define TILE_ATTR(pal, prio, flipV, flipH) (((flipH) << 11) + ((flipV) << 12) + ((pal) << 13) + ((prio) << 15))
BGタイルのアトリビュートを設定します。
pal:パレット番号
prio:プライオリティ
flipV:垂直反転
flipH:水平反転

このマクロでパレット指定、プライオリティ、上下反転、左右反転のアトリビュートを指定できるようです。

■ スクロールしてみる

メガドラのBG面はスクロールできるので、ドキュメントからそれっぽい関数を探してみます。

void VDP_setHorizontalScroll(VDPPlan plan, s16 value)
planにはVDP_PLAN_AかVDP_PLAN_Bを指定します。valueに負の値を指定すると左側に、正の値を指定すると右に移動します。
#include <genesis.h>
#include <string.h>

int main()
{
	u16 x1, y1;
	u16 pad1;
	char str_x[12], str_y[12];

	x1 = y1 = 0;

	VDP_drawTextBG(VDP_PLAN_B, "PLANE-B", TILE_ATTR(PAL0, 1, 0, 0), 0, 14);
	strcpy(str_x, "x:00000000");
	strcpy(str_y, "y:00000000");

	while(1)
	{
		pad1 = JOY_readJoypad(JOY_1);
		if (pad1 & BUTTON_UP) y1--;
		if (pad1 & BUTTON_DOWN) y1++;
		if (pad1 & BUTTON_LEFT) x1--;
		if (pad1 & BUTTON_RIGHT) x1++;
		intToHex(x1, str_x+2, 8);
		intToHex(y1, str_y+2, 8);

        VDP_waitVSync();
		VDP_drawTextBG(VDP_PLAN_A, str_x, TILE_ATTR(PAL0, 1, 0, 0), 0, 0);
		VDP_drawTextBG(VDP_PLAN_A, str_y, TILE_ATTR(PAL0, 1, 0, 0), 0, 1);
        VDP_setHorizontalScroll(PLAN_A, x1);
        VDP_setVerticalScroll(PLAN_A, y1);
	}

	return (0);
}

X方向のスクロール方向が逆になっちゃうんですが、そういうものなのかな。


上のページに戻る