From a910bccb3e2f70865d4a2f4d2991b864a97bebed Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sat, 24 Apr 2021 16:09:29 +0200 Subject: Add the rest of the buttons --- src/gba-buttons.c | 127 +++++++++++++++++++++++- src/main.c | 281 +++++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 328 insertions(+), 80 deletions(-) diff --git a/src/gba-buttons.c b/src/gba-buttons.c index 5a2a6e2..7f13676 100644 --- a/src/gba-buttons.c +++ b/src/gba-buttons.c @@ -24,7 +24,7 @@ u32 gba_btn_l_data[] = { }; u32 gba_btn_r_data[] = { - 0xff018181, 0x818101ff, 0x3f408182, 0x818280ff, + 0xff01c141, 0xc14101ff, 0x3f408081, 0x808180ff, }; u32 gba_btn_ab_shadow_data[] = { @@ -52,6 +52,16 @@ u32 gba_btn_startselect_data[] = { 0x000000f8, 0x04f80000, 0x0000001f, 0x201f0000, }; +u32 gba_btn_start_text[] = { + 0x00008080, 0x00800000, 0x0000bb91, 0x92930000, + 0x00009b2a, 0x1b2a0000, 0x00000301, 0x01010000, +}; + +u32 gba_btn_select_text[] = { + 0x0000e060, 0x80e00000, 0x00002e26, 0x22ee0000, + 0x0000ee26, 0x22ee0000, 0x00000e04, 0x04040000, +}; + u32 gba_btn_fx_downup[] = { 0x00000000, 0x00000000, 0x04000000, 0x00000000, 0x40000100, 0x00000000, 0x00000000, 0x00000000, @@ -74,6 +84,55 @@ u32 gba_btn_fx_leftright[] = { 0x40000000, 0x00000000, 0x00001000, 0x00000000, }; +u32 gba_btn_fx_lr[] = { + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00008004, 0x00000002, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000080, 0x80810200, 0x00000001, + 0x00000000, 0x00000000, 0x00000000, 0x00000080, + 0x80000000, 0x000000c0, 0x80010000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000080, + 0x80000000, 0x00000020, 0x00000000, 0x00000000, +}; + +u32 gba_btn_fx_ab[] = { + 0x00000000, 0x00408000, 0x00000080, 0x80800001, + 0x00000000, 0x00000080, 0x00000000, 0x00020100, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x38000000, 0x00000080, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x1c000000, 0x00000001, + 0x40200000, 0x00000000, 0x00008080, 0x80000000, + 0x00000000, 0x00000000, 0x02040000, 0x00000000, + 0x00000000, 0x20400000, 0x00808000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x04020000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0c000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x30000000, 0x00000000, + 0x00201000, 0x00000000, 0x00000000, 0x80800000, + 0x00000000, 0x00000000, 0x00040800, 0x00000000, + 0x00000000, 0x20000000, 0x00800000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x04000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x04000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x20000000, 0x00000000, + 0x00001000, 0x00000000, 0x00000000, 0x00800000, + 0x00000000, 0x00000000, 0x00000800, 0x00000000, +}; + +u32 gba_btn_fx_startselect[] = { + 0x00000000, 0x00000000, 0x00000000, 0x10000002, + 0x00000001, 0x10000080, 0x00000000, 0x00000000, + 0x00000000, 0x00000080, 0x00000408, 0x00000001, + 0x00014120, 0x00000000, 0x00000000, 0x00000003, + 0x00000000, 0x000000c0, 0x00020400, 0x00000000, + 0x01814000, 0x00000000, 0x00000000, 0x00000006, + 0x00000000, 0x00000040, 0x00020000, 0x00000000, + 0x01800000, 0x00000000, 0x00000000, 0x00000004, +}; + typedef struct SpriteAnimation { size_t *tile_offsets; size_t n_frames; @@ -152,3 +211,69 @@ AnimationEntry *btn_animation[] = { {0, 0, 12, 1}, }, }; + +AnimationEntry *btn_animation_ab[] = { + &(AnimationEntry[]){ + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 1, 0, 0}, + {0, 1, 0, 0}, + {0, 2, 0, 0}, + {0, 2, 0, 0}, + {0, 2, 0, 0}, + {0, 2, 0, 0}, + }, + &(AnimationEntry[]){ + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + }, + &(AnimationEntry[]){ + {0, 0, 0, 1}, + {0, 0, 0, 1}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 16, 0}, + {0, 0, 16, 0}, + {0, 0, 32, 0}, + {0, 0, 32, 1}, + }, +}; + +AnimationEntry *btn_animation_startselect[] = { + &(AnimationEntry[]){ + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 2, 0}, + {0, 0, 2, 0}, + {0, 0, 2, 0}, + {0, 0, 2, 0}, + {0, 0, 2, 0}, + {0, 0, 2, 0}, + }, + &(AnimationEntry[]){ + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + }, + &(AnimationEntry[]){ + {0, 0, 0, 1}, + {0, 0, 4, 0}, + {0, 0, 4, 0}, + {0, 0, 8, 0}, + {0, 0, 8, 0}, + {0, 0, 12, 0}, + {0, 0, 12, 0}, + {0, 0, 12, 1}, + }, +}; diff --git a/src/main.c b/src/main.c index 8008c32..2876e18 100644 --- a/src/main.c +++ b/src/main.c @@ -688,49 +688,6 @@ int main(void) { // Initialize the A/B button sprites. int buttons_x = SCREEN_WIDTH / 2; int buttons_y = SCREEN_HEIGHT / 2; - ButtonSprite btn_b = { - .id = load_packed_sprite_data(&gba_btn_b_data, 4, 1), - .x = buttons_x + 32, - .y = buttons_y + 32, - .frame = 0, - .state = BTN_STATE_IDLE, - }; - OBJ_ATTR_0(btn_b.id) = btn_b.y; - OBJ_ATTR_1(btn_b.id) = btn_b.x | (1 << 0xE); - OBJ_ATTR_2(btn_b.id) = sprites[btn_b.id].tile_start; - - ButtonSprite btn_a = { - .id = load_packed_sprite_data(&gba_btn_a_data, 4, 1), - .x = buttons_x + 32 + 20, - .y = buttons_y + 32 - 16, - .frame = 0, - .state = BTN_STATE_IDLE, - }; - OBJ_ATTR_0(btn_a.id) = btn_a.y; - OBJ_ATTR_1(btn_a.id) = btn_a.x | (1 << 0xE); - OBJ_ATTR_2(btn_a.id) = sprites[btn_a.id].tile_start; - - ButtonSprite btn_start = { - .id = load_packed_sprite_data(&gba_btn_startselect_data, 2, 2), - .x = buttons_x - 10, - .y = buttons_y + 40, - .frame = 0, - .state = BTN_STATE_IDLE, - }; - OBJ_ATTR_0(btn_start.id) = btn_start.y | (1 << 0xE); - OBJ_ATTR_1(btn_start.id) = btn_start.x; - OBJ_ATTR_2(btn_start.id) = sprites[btn_start.id].tile_start; - - ButtonSprite btn_select = { - .id = load_packed_sprite_data(&gba_btn_startselect_data, 2, 2), - .x = buttons_x - 32, - .y = buttons_y + 40, - .frame = 0, - .state = BTN_STATE_IDLE, - }; - OBJ_ATTR_0(btn_select.id) = btn_select.y | (1 << 0xE); - OBJ_ATTR_1(btn_select.id) = btn_select.x; - OBJ_ATTR_2(btn_select.id) = sprites[btn_select.id].tile_start; MultiSprite buttons[] = { // DOWN. @@ -918,7 +875,7 @@ int main(void) { .x = buttons_x - 64 - 28, .y = buttons_y - 32 - 20, .data = &gba_btn_l_data, - .n_tiles = 4, + .n_tiles = 2, .frames = 1, .obj_attr_0 = OBJ_SHAPE_WIDE, .obj_attr_1 = OBJ_SIZE_SMALL, @@ -961,7 +918,7 @@ int main(void) { .x = buttons_x + 32 + 20 + 24, .y = buttons_y - 32 - 20, .data = &gba_btn_r_data, - .n_tiles = 4, + .n_tiles = 2, .frames = 1, .obj_attr_0 = OBJ_SHAPE_WIDE, .obj_attr_1 = OBJ_SIZE_SMALL, @@ -991,6 +948,178 @@ int main(void) { }, }, }, + // A. + { + .frame = 0, + .n_obj = 3, + .n_frames = 8, + .state = BTN_STATE_RELEASED, + .animations = &btn_animation_ab, + .sprites = &(ObjState[]){ + { + .id = 0, + .x = buttons_x + 32 + 20 + 20, + .y = buttons_y + 32 - 16, + .data = &gba_btn_a_data, + .n_tiles = 4, + .frames = 1, + .obj_attr_0 = OBJ_SHAPE_SQUARE, + .obj_attr_1 = OBJ_SIZE_MID, + .obj_attr_2 = 0 + }, + { + .id = 0, + .x = buttons_x + 32 + 20 + 20, + .y = buttons_y + 32 - 16 + 8, + .data = &gba_btn_ab_shadow_data, + .n_tiles = 2, + .frames = 1, + .obj_attr_0 = OBJ_SHAPE_WIDE, + .obj_attr_1 = OBJ_SIZE_SMALL, + .obj_attr_2 = 0 + }, + { + .id = 0, + .x = buttons_x + 32 + 19 - 7 + 20, + .y = buttons_y + 32 - 23, + .data = &gba_btn_fx_ab, + .n_tiles = 16, + .frames = 3, + .obj_attr_0 = OBJ_SHAPE_SQUARE, + .obj_attr_1 = OBJ_SIZE_BIG, + .obj_attr_2 = 0 + }, + }, + }, + // B. + { + .frame = 0, + .n_obj = 3, + .n_frames = 8, + .state = BTN_STATE_RELEASED, + .animations = &btn_animation_ab, + .sprites = &(ObjState[]){ + { + .id = 0, + .x = buttons_x + 32 + 20, + .y = buttons_y + 32, + .data = &gba_btn_b_data, + .n_tiles = 4, + .frames = 1, + .obj_attr_0 = OBJ_SHAPE_SQUARE, + .obj_attr_1 = OBJ_SIZE_MID, + .obj_attr_2 = 0 + }, + { + .id = 0, + .x = buttons_x + 32 + 20, + .y = buttons_y + 32 + 8, + .data = &gba_btn_ab_shadow_data, + .n_tiles = 2, + .frames = 1, + .obj_attr_0 = OBJ_SHAPE_WIDE, + .obj_attr_1 = OBJ_SIZE_SMALL, + .obj_attr_2 = 0 + }, + { + .id = 0, + .x = buttons_x + 32 - 8 + 20, + .y = buttons_y + 33 + 8 - 16, + .data = &gba_btn_fx_ab, + .n_tiles = 16, + .frames = 3, + .obj_attr_0 = OBJ_SHAPE_SQUARE, + .obj_attr_1 = OBJ_SIZE_BIG, + .obj_attr_2 = 0 + }, + }, + }, + // START. + { + .frame = 0, + .n_obj = 3, + .n_frames = 8, + .state = BTN_STATE_RELEASED, + .animations = &btn_animation_startselect, + .sprites = &(ObjState[]){ + { + .id = 0, + .x = buttons_x - 10 - 14, + .y = buttons_y + 40 + 10, + .data = &gba_btn_startselect_data, + .n_tiles = 2, + .frames = 2, + .obj_attr_0 = OBJ_SHAPE_WIDE, + .obj_attr_1 = OBJ_SIZE_SMALL, + .obj_attr_2 = 0 + }, + { + .id = 0, + .x = buttons_x - 18 - 14, + .y = buttons_y + 46 + 10, + .data = &gba_btn_start_text, + .n_tiles = 4, + .frames = 1, + .obj_attr_0 = OBJ_SHAPE_WIDE, + .obj_attr_1 = OBJ_SIZE_MID, + .obj_attr_2 = 0 + }, + { + .id = 0, + .x = buttons_x - 19 - 14, + .y = buttons_y + 37 + 10, + .data = &gba_btn_fx_startselect, + .n_tiles = 4, + .frames = 4, + .obj_attr_0 = OBJ_SHAPE_WIDE, + .obj_attr_1 = OBJ_SIZE_MID, + .obj_attr_2 = 0 + }, + }, + }, + // SELECT. + { + .frame = 0, + .n_obj = 3, + .n_frames = 8, + .state = BTN_STATE_RELEASED, + .animations = &btn_animation_startselect, + .sprites = &(ObjState[]){ + { + .id = 0, + .x = buttons_x - 10 + 26 - 14, + .y = buttons_y + 40 + 10, + .data = &gba_btn_startselect_data, + .n_tiles = 2, + .frames = 2, + .obj_attr_0 = OBJ_SHAPE_WIDE, + .obj_attr_1 = OBJ_SIZE_SMALL, + .obj_attr_2 = 0 + }, + { + .id = 0, + .x = buttons_x - 18 + 26 - 14, + .y = buttons_y + 46 + 10, + .data = &gba_btn_select_text, + .n_tiles = 4, + .frames = 1, + .obj_attr_0 = OBJ_SHAPE_WIDE, + .obj_attr_1 = OBJ_SIZE_MID, + .obj_attr_2 = 0 + }, + { + .id = 0, + .x = buttons_x - 19 + 26 - 14, + .y = buttons_y + 37 + 10, + .data = &gba_btn_fx_startselect, + .n_tiles = 4, + .frames = 4, + .obj_attr_0 = OBJ_SHAPE_WIDE, + .obj_attr_1 = OBJ_SIZE_MID, + .obj_attr_2 = 0 + }, + }, + }, }; for (size_t i = 0; i < sizeof(buttons) / sizeof(MultiSprite); ++i) { init_button_sprite(&buttons[i]); @@ -1003,40 +1132,6 @@ int main(void) { wait_vsync(); poll_keys(); - // if (key_pressed(KEY_B)) { - // btn_b.frame = 0; - // btn_b.state = BTN_STATE_PRESSED; - // } else if (key_hold(KEY_B)) { - // if (btn_b.frame < btn_b.n_frames - 1) { - // btn_b.frame++; - // } - // } else { - // // Finish the animation and reset idle state. - // if (btn_b.frame > 0 && btn_b.frame < btn_b.n_frames - 1) { - // btn_b.frame++; - // } else { - // btn_b.frame = 0; - // btn_b.state = BTN_STATE_IDLE; - // } - // } - // if (key_pressed(KEY_A)) { - // btn_a.frame = 0; - // btn_a.state = BTN_STATE_PRESSED; - // } else if (key_hold(KEY_A)) { - // size_t n_frames = animation_states[btn_a.state]->n_frames; - // if (btn_a.frame < n_frames - 1) { - // btn_a.frame++; - // } - // } else { - // // Finish the animation and reset idle state. - // size_t n_frames = animation_states[btn_a.state]->n_frames; - // if (btn_a.frame > 0 && btn_a.frame < n_frames - 1) { - // btn_a.frame++; - // } else { - // btn_a.frame = 0; - // btn_a.state = BTN_STATE_IDLE; - // } - // } if (key_pressed(KEY_DOWN)) { buttons[0].state = BTN_STATE_PRESSED; } else if (key_hold(KEY_DOWN)) { @@ -1079,6 +1174,34 @@ int main(void) { } else { buttons[5].state = BTN_STATE_RELEASED; } + if (key_pressed(KEY_A)) { + buttons[6].state = BTN_STATE_PRESSED; + } else if (key_hold(KEY_A)) { + buttons[6].state = BTN_STATE_HOLD; + } else { + buttons[6].state = BTN_STATE_RELEASED; + } + if (key_pressed(KEY_B)) { + buttons[7].state = BTN_STATE_PRESSED; + } else if (key_hold(KEY_B)) { + buttons[7].state = BTN_STATE_HOLD; + } else { + buttons[7].state = BTN_STATE_RELEASED; + } + if (key_pressed(KEY_START)) { + buttons[8].state = BTN_STATE_PRESSED; + } else if (key_hold(KEY_START)) { + buttons[8].state = BTN_STATE_HOLD; + } else { + buttons[8].state = BTN_STATE_RELEASED; + } + if (key_pressed(KEY_SELECT)) { + buttons[9].state = BTN_STATE_PRESSED; + } else if (key_hold(KEY_SELECT)) { + buttons[9].state = BTN_STATE_HOLD; + } else { + buttons[9].state = BTN_STATE_RELEASED; + } if (key_hold(KEY_DOWN)) { y += 3; -- cgit v1.2.1