歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【GB】複数スプライトのキャラクターを動かす

こちらの実装を元にしていますが、「複数スプライトを利用していること(それをなんちゃってオブジェクト指向で隠蔽していること)」「斜め移動に対応していること」が工夫した点です。

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) {
    // copyのため?
    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

組込み開発のための実践的プログラミング

組込み開発のための実践的プログラミング