今回は「スプライト表示とコントローラー入力」です。
1)スプライト表示
メガドライブでスプライトを表示するためには、画像表示と同じように3つの段階が必要です。
① VRAMに画像のタイルデータを読み込む。
② 画像のパレットを読み込む。
③ スプライトに表示したい画像を設定し、スプライトのサイズ、表示する座標を設定します。
●サンプルコード : test_03
<main.c>
#include <genesis.h>
/* gfx.resで指定した画像(Sprite構造体)を読み込めるように設定 */
#include "gfx.h"
int main()
{
/* VRAM処理中に割り込み処理が入るのを禁止 */
SYS_disableInts();
/* ①VRAMに画像をコピーします。 */
VDP_loadTileSet(spr_player.animations[0]->frames[0]->tileset, TILE_USERINDEX, 0);
/* ②画像のパレットを、1番目のパレット(PAL0)に読み込む */
VDP_setPalette(PAL0, spr_player.palette->data);
/* ③スプライトに画像を設定し、画面内に表示 */
VDP_setSpriteFull(0, 100, 100, SPRITE_SIZE(2, 2), TILE_ATTR_FULL(PAL0, FALSE, FALSE, FALSE, TILE_USERINDEX), 1);
/* 割り込みを可能に*/
SYS_enableInts();
while(1)
{
/* スプライトを描画 */
VDP_updateSprites(1, TRUE);
/* 1/60秒毎に発生するVSyncを待つ */
VDP_waitVSync();
}
return (0);
}
<gfx.res>
/* gr_player.pngをSprite構造体として読み込む */
SPRITE spr_player "gr_player.png" 2 2 -1
こんな感じで表示できれば成功です。
2)コントローラー入力
コントローラーからの入力の情報は、
u16 JOY_readJoypad(u16 joy)
で得ることが出来ます。
引数joyは読み取りたいコントローラーのタイプ(例えば1PのパッドはJOY_1)で、どのキーが押されているかの情報が戻り値として返されます。
●サンプルコード : test_04
<main.c>
#include <genesis.h>
#include "gfx.h"
int main()
{
/* プレイヤーのx軸の座標用の変数 */
s16 iPosX = 100;
SYS_disableInts();
VDP_loadTileSet(spr_player.animations[0]->frames[0]->tileset, TILE_USERINDEX, 0);
VDP_setPalette(PAL0, spr_player.palette->data);
VDP_setSpriteFull(0, iPosX, 100, SPRITE_SIZE(2, 2), TILE_ATTR_FULL(PAL0, FALSE, FALSE, FALSE, TILE_USERINDEX), 1);
SYS_enableInts();
while(1)
{
/* 1Pのコントローラーの入力情報を変数valueに代入 */
u16 value = JOY_readJoypad(JOY_1);
/* 右方向キーが押されていたら、座標に1を加える */
if (value & BUTTON_RIGHT) iPosX += 1;
/* 左方向キーが押されていたら、座標から1引く */
else if(value & BUTTON_LEFT) iPosX -= 1;
/* スプライトの座標を変更 */
VDP_setSpritePosition(0, iPosX, 100);
VDP_updateSprites(1, TRUE);
VDP_waitVSync();
}
return (0);
}
<gfx.res>
SPRITE spr_player "gr_player.png" 2 2 -1
コントローラーの左右のキーでキャラクターが動くはずです。
コントローラーのキーは、
BUTTON_UP
BUTTON_DOWN
BUTTON_LEFT
BUTTON_RIGHT
BUTTON_A
BUTTON_B
BUTTON_C
BUTTON_START
BUTTON_X
BUTTON_Y
BUTTON_Z
BUTTON_MODE
のように設定されています。