こちらの実装を元にしていますが、「複数スプライトを利用していること(それをなんちゃってオブジェクト指向で隠蔽していること)」「斜め移動に対応していること」が工夫した点です。
github.com
こんな感じのコードを実装しています。
const unsigned char sprite[] = {
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x1F, 0x00, 0x3F,
0x00, 0x7F, 0x00, 0x77,
0x08, 0x6B, 0x40, 0x77,
0x80, 0xFF, 0x00, 0x7F,
0x00, 0x3F, 0x00, 0x1F,
0x10, 0x1F, 0x30, 0x30
};
typedef struct _Player {
UBYTE i, x, y;
} Player;
void Player_init(Player* player, UBYTE i, UBYTE x, UBYTE y) {
player->i = i * 1;
player->x = x * 1;
player->y = y * 1;
SPRITES_8x16;
set_sprite_data(player->i, 0, sprite);
set_sprite_data(player->i + 2, 0, sprite);
set_sprite_prop(player->i + 2, S_FLIPX);
set_sprite_tile(player->i, 0);
set_sprite_tile(player->i + 2, 0);
move_sprite(player->i, player->x, player->y);
move_sprite(player->i + 2, player->x + 7, player->y);
SHOW_SPRITES;
}
void Player_move(Player* player, UBYTE joystate) {
if (!joystate) {
return;
}
if (joystate & J_RIGHT) player->x++;
else if (joystate & J_LEFT) player->x--;
if (joystate & J_UP) player->y--;
else if (joystate & J_DOWN) player->y++;
move_sprite(player->i, player->x, player->y);
move_sprite(player->i + 2, player->x + 7, player->y);
delay(10);
}
こういう副作用多くて、なんとか隠蔽しなきゃいけないときオブジェクト指向的な発想って便利ですね。また、自分自身は組み込みプログラミングに慣れていないので joystate & J_DOWN
みたいな「共通するビットが立っているとき実行する」ような発想のコードはちょっと新鮮でした。
kiito.hatenablog.com
また、割り込みでBGM出してみています。というか実はこちらが主目的です。
sakana38.hatenablog.com
こちらで実装中です。
github.com