こちらの実装を元にしていますが、「複数スプライトを利用していること(それをなんちゃってオブジェクト指向で隠蔽していること)」「斜め移動に対応していること」が工夫した点です。
こんな感じのコードを実装しています。
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
みたいな「共通するビットが立っているとき実行する」ような発想のコードはちょっと新鮮でした。
また、割り込みでBGM出してみています。というか実はこちらが主目的です。
こちらで実装中です。
- 作者: 鷹合大輔,田村修
- 出版社/メーカー: 近代科学社
- 発売日: 2018/04/03
- メディア: 単行本
- この商品を含むブログ (1件) を見る