diff options
author | Bad Diode <bd@badd10de.dev> | 2021-04-23 23:35:44 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-04-23 23:35:44 +0200 |
commit | 30a7de0d7bfd4b076a57a029a08ce1fd9eccd429 (patch) | |
tree | a59a07dca278c1ff96eb5780df4ea2a580cb015e | |
parent | f652b2a9c76194ee285e001e6b04a7dc585e8993 (diff) | |
download | gba-experiments-30a7de0d7bfd4b076a57a029a08ce1fd9eccd429.tar.gz gba-experiments-30a7de0d7bfd4b076a57a029a08ce1fd9eccd429.zip |
Add new animations for dpad
-rw-r--r-- | src/gba-buttons.c | 57 | ||||
-rw-r--r-- | src/main.c | 199 |
2 files changed, 189 insertions, 67 deletions
diff --git a/src/gba-buttons.c b/src/gba-buttons.c index cbf6f8b..5a2a6e2 100644 --- a/src/gba-buttons.c +++ b/src/gba-buttons.c | |||
@@ -55,12 +55,23 @@ u32 gba_btn_startselect_data[] = { | |||
55 | u32 gba_btn_fx_downup[] = { | 55 | u32 gba_btn_fx_downup[] = { |
56 | 0x00000000, 0x00000000, 0x04000000, 0x00000000, | 56 | 0x00000000, 0x00000000, 0x04000000, 0x00000000, |
57 | 0x40000100, 0x00000000, 0x00000000, 0x00000000, | 57 | 0x40000100, 0x00000000, 0x00000000, 0x00000000, |
58 | 0x00000000, 0x00000000, 0x00000201, 0x00000000, | 58 | 0x00000000, 0x00000000, 0x00020100, 0x00000000, |
59 | 0x00008000, 0x01010000, 0x00000001, 0x00000000, | 59 | 0x00800001, 0x01000000, 0x00000100, 0x00000000, |
60 | 0x00000000, 0x80000000, 0x00000001, 0x00000000, | 60 | 0x00000080, 0x00000000, 0x00000100, 0x00000000, |
61 | 0x00000000, 0x00010100, 0x00000001, 0x02000000, | 61 | 0x00000000, 0x01010000, 0x00000102, 0x00000000, |
62 | 0x00000000, 0x00400000, 0x00000000, 0x00000000, | 62 | 0x00000000, 0x40000000, 0x00000000, 0x00000000, |
63 | 0x00000000, 0x00000001, 0x00000000, 0x00040000, | 63 | 0x00000000, 0x00000100, 0x00000000, 0x04000000, |
64 | }; | ||
65 | |||
66 | u32 gba_btn_fx_leftright[] = { | ||
67 | 0x00000000, 0x00000000, 0x00000100, 0x00000000, | ||
68 | 0x04000000, 0x00000100, 0x00000000, 0x00000000, | ||
69 | 0x00000000, 0x00000000, 0x04020000, 0x00000000, | ||
70 | 0x18000000, 0x00000002, 0x04000000, 0x00000000, | ||
71 | 0x00000000, 0x00000008, 0x04000000, 0x00000000, | ||
72 | 0x30000000, 0x00000000, 0x04080000, 0x00000000, | ||
73 | 0x00000000, 0x00001000, 0x00000000, 0x00000000, | ||
74 | 0x40000000, 0x00000000, 0x00001000, 0x00000000, | ||
64 | }; | 75 | }; |
65 | 76 | ||
66 | typedef struct SpriteAnimation { | 77 | typedef struct SpriteAnimation { |
@@ -109,7 +120,7 @@ typedef struct ObjState { | |||
109 | u16 obj_attr_2; | 120 | u16 obj_attr_2; |
110 | } ObjState; | 121 | } ObjState; |
111 | 122 | ||
112 | AnimationEntry *btn_down_animation[] = { | 123 | AnimationEntry *btn_animation[] = { |
113 | &(AnimationEntry[]){ | 124 | &(AnimationEntry[]){ |
114 | {0, 0, 0, 0}, | 125 | {0, 0, 0, 0}, |
115 | {0, 0, 0, 0}, | 126 | {0, 0, 0, 0}, |
@@ -121,23 +132,23 @@ AnimationEntry *btn_down_animation[] = { | |||
121 | {0, 2, 0, 0}, | 132 | {0, 2, 0, 0}, |
122 | }, | 133 | }, |
123 | &(AnimationEntry[]){ | 134 | &(AnimationEntry[]){ |
124 | {0, 11, 0, 0}, | 135 | {0, 0, 0, 0}, |
125 | {0, 11, 0, 0}, | 136 | {0, 0, 0, 0}, |
126 | {0, 11, 0, 0}, | 137 | {0, 0, 0, 0}, |
127 | {0, 11, 0, 0}, | 138 | {0, 0, 0, 0}, |
128 | {0, 11, 0, 0}, | 139 | {0, 0, 0, 0}, |
129 | {0, 11, 0, 0}, | 140 | {0, 0, 0, 0}, |
130 | {0, 11, 0, 0}, | 141 | {0, 0, 0, 0}, |
131 | {0, 11, 0, 0}, | 142 | {0, 0, 0, 0}, |
132 | }, | 143 | }, |
133 | &(AnimationEntry[]){ | 144 | &(AnimationEntry[]){ |
134 | {-8, 17, 0, 1}, | 145 | {0, 0, 0, 1}, |
135 | {-8, 17, 0, 0}, | 146 | {0, 0, 0, 0}, |
136 | {-8, 17, 4, 0}, | 147 | {0, 0, 4, 0}, |
137 | {-8, 17, 4, 0}, | 148 | {0, 0, 4, 0}, |
138 | {-8, 17, 8, 0}, | 149 | {0, 0, 8, 0}, |
139 | {-8, 17, 8, 0}, | 150 | {0, 0, 8, 0}, |
140 | {-8, 17, 12, 0}, | 151 | {0, 0, 12, 0}, |
141 | {-8, 17, 12, 1}, | 152 | {0, 0, 12, 1}, |
142 | }, | 153 | }, |
143 | }; | 154 | }; |
@@ -710,39 +710,6 @@ int main(void) { | |||
710 | OBJ_ATTR_1(btn_a.id) = btn_a.x | (1 << 0xE); | 710 | OBJ_ATTR_1(btn_a.id) = btn_a.x | (1 << 0xE); |
711 | OBJ_ATTR_2(btn_a.id) = sprites[btn_a.id].tile_start; | 711 | OBJ_ATTR_2(btn_a.id) = sprites[btn_a.id].tile_start; |
712 | 712 | ||
713 | ButtonSprite btn_up = { | ||
714 | .id = load_packed_sprite_data(&gba_btn_updown_data, 4, 1), | ||
715 | .x = buttons_x - 64 - 16, | ||
716 | .y = buttons_y + 32 - 18, | ||
717 | .frame = 0, | ||
718 | .state = BTN_STATE_IDLE, | ||
719 | }; | ||
720 | OBJ_ATTR_0(btn_up.id) = btn_up.y; | ||
721 | OBJ_ATTR_1(btn_up.id) = btn_up.x | (1 << 0xE); | ||
722 | OBJ_ATTR_2(btn_up.id) = sprites[btn_up.id].tile_start; | ||
723 | |||
724 | ButtonSprite btn_left = { | ||
725 | .id = load_packed_sprite_data(&gba_btn_leftright_data, 4, 1), | ||
726 | .x = buttons_x - 64 - 16 - 10, | ||
727 | .y = buttons_y + 32 - 10, | ||
728 | .frame = 0, | ||
729 | .state = BTN_STATE_IDLE, | ||
730 | }; | ||
731 | OBJ_ATTR_0(btn_left.id) = btn_left.y; | ||
732 | OBJ_ATTR_1(btn_left.id) = btn_left.x | (1 << 0xE); | ||
733 | OBJ_ATTR_2(btn_left.id) = sprites[btn_left.id].tile_start; | ||
734 | |||
735 | ButtonSprite btn_right = { | ||
736 | .id = load_packed_sprite_data(&gba_btn_leftright_data, 4, 1), | ||
737 | .x = buttons_x - 64 - 16 + 11, | ||
738 | .y = buttons_y + 32 - 10, | ||
739 | .frame = 0, | ||
740 | .state = BTN_STATE_IDLE, | ||
741 | }; | ||
742 | OBJ_ATTR_0(btn_right.id) = btn_right.y; | ||
743 | OBJ_ATTR_1(btn_right.id) = btn_right.x | (1 << 0xE) | (1 << 0xC); | ||
744 | OBJ_ATTR_2(btn_right.id) = sprites[btn_right.id].tile_start; | ||
745 | |||
746 | ButtonSprite btn_l = { | 713 | ButtonSprite btn_l = { |
747 | .id = load_packed_sprite_data(&gba_btn_l_data, 2, 1), | 714 | .id = load_packed_sprite_data(&gba_btn_l_data, 2, 1), |
748 | .x = buttons_x - 64 - 28, | 715 | .x = buttons_x - 64 - 28, |
@@ -788,12 +755,13 @@ int main(void) { | |||
788 | OBJ_ATTR_2(btn_select.id) = sprites[btn_select.id].tile_start; | 755 | OBJ_ATTR_2(btn_select.id) = sprites[btn_select.id].tile_start; |
789 | 756 | ||
790 | MultiSprite buttons[] = { | 757 | MultiSprite buttons[] = { |
758 | // DOWN. | ||
791 | { | 759 | { |
792 | .frame = 0, | 760 | .frame = 0, |
793 | .n_obj = 3, | 761 | .n_obj = 3, |
794 | .n_frames = 8, | 762 | .n_frames = 8, |
795 | .state = BTN_STATE_RELEASED, | 763 | .state = BTN_STATE_RELEASED, |
796 | .animations = &btn_down_animation, | 764 | .animations = &btn_animation, |
797 | .sprites = &(ObjState[]){ | 765 | .sprites = &(ObjState[]){ |
798 | { | 766 | { |
799 | .id = 0, | 767 | .id = 0, |
@@ -809,7 +777,7 @@ int main(void) { | |||
809 | { | 777 | { |
810 | .id = 0, | 778 | .id = 0, |
811 | .x = buttons_x - 64 - 16, | 779 | .x = buttons_x - 64 - 16, |
812 | .y = buttons_y + 29, | 780 | .y = buttons_y + 29 + 11, |
813 | .data = &gba_btn_down_shadow_data, | 781 | .data = &gba_btn_down_shadow_data, |
814 | .n_tiles = 2, | 782 | .n_tiles = 2, |
815 | .frames = 1, | 783 | .frames = 1, |
@@ -819,17 +787,147 @@ int main(void) { | |||
819 | }, | 787 | }, |
820 | { | 788 | { |
821 | .id = 0, | 789 | .id = 0, |
790 | .x = buttons_x - 64 - 16 - 8, | ||
791 | .y = buttons_y + 29 + 17, | ||
792 | .data = &gba_btn_fx_downup, | ||
793 | .n_tiles = 4, | ||
794 | .frames = 4, | ||
795 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
796 | .obj_attr_1 = OBJ_SIZE_MID, | ||
797 | .obj_attr_2 = 0 | ||
798 | }, | ||
799 | }, | ||
800 | }, | ||
801 | // UP. | ||
802 | { | ||
803 | .frame = 0, | ||
804 | .n_obj = 3, | ||
805 | .n_frames = 8, | ||
806 | .state = BTN_STATE_RELEASED, | ||
807 | .animations = &btn_animation, | ||
808 | .sprites = &(ObjState[]){ | ||
809 | { | ||
810 | .id = 0, | ||
822 | .x = buttons_x - 64 - 16, | 811 | .x = buttons_x - 64 - 16, |
823 | .y = buttons_y + 29, | 812 | .y = buttons_y + 32 - 18, |
813 | .data = &gba_btn_updown_data, | ||
814 | .n_tiles = 4, | ||
815 | .frames = 1, | ||
816 | .obj_attr_0 = 0, | ||
817 | .obj_attr_1 = OBJ_SIZE_MID, | ||
818 | .obj_attr_2 = 0 | ||
819 | }, | ||
820 | { | ||
821 | .id = 0, | ||
822 | .x = buttons_x - 64 - 16, | ||
823 | .y = buttons_y + 32 - 18 + 7, | ||
824 | .data = &gba_btn_up_shadow_data, | ||
825 | .n_tiles = 2, | ||
826 | .frames = 1, | ||
827 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
828 | .obj_attr_1 = OBJ_SIZE_SMALL, | ||
829 | .obj_attr_2 = 0 | ||
830 | }, | ||
831 | { | ||
832 | .id = 0, | ||
833 | .x = buttons_x - 64 - 16 - 8, | ||
834 | .y = buttons_y + 32 - 18 - 7, | ||
824 | .data = &gba_btn_fx_downup, | 835 | .data = &gba_btn_fx_downup, |
825 | .n_tiles = 4, | 836 | .n_tiles = 4, |
826 | .frames = 4, | 837 | .frames = 4, |
827 | .obj_attr_0 = OBJ_SHAPE_WIDE, | 838 | .obj_attr_0 = OBJ_SHAPE_WIDE, |
839 | .obj_attr_1 = OBJ_V_FLIP | OBJ_SIZE_MID, | ||
840 | .obj_attr_2 = 0 | ||
841 | }, | ||
842 | }, | ||
843 | }, | ||
844 | // LEFT | ||
845 | { | ||
846 | .frame = 0, | ||
847 | .n_obj = 3, | ||
848 | .n_frames = 8, | ||
849 | .state = BTN_STATE_RELEASED, | ||
850 | .animations = &btn_animation, | ||
851 | .sprites = &(ObjState[]){ | ||
852 | { | ||
853 | .id = 0, | ||
854 | .x = buttons_x - 64 - 16 - 10, | ||
855 | .y = buttons_y + 32 - 10, | ||
856 | .data = &gba_btn_leftright_data, | ||
857 | .n_tiles = 4, | ||
858 | .frames = 1, | ||
859 | .obj_attr_0 = 0, | ||
860 | .obj_attr_1 = OBJ_SIZE_MID, | ||
861 | .obj_attr_2 = 0 | ||
862 | }, | ||
863 | { | ||
864 | .id = 0, | ||
865 | .x = buttons_x - 64 - 16 - 10, | ||
866 | .y = buttons_y + 32 - 10 + 6, | ||
867 | .data = &gba_btn_leftright_shadow_data, | ||
868 | .n_tiles = 2, | ||
869 | .frames = 1, | ||
870 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
871 | .obj_attr_1 = OBJ_SIZE_SMALL, | ||
872 | .obj_attr_2 = 0 | ||
873 | }, | ||
874 | { | ||
875 | .id = 0, | ||
876 | .x = buttons_x - 64 - 16 - 10 - 6, | ||
877 | .y = buttons_y + 32 - 10 - 8, | ||
878 | .data = &gba_btn_fx_leftright, | ||
879 | .n_tiles = 4, | ||
880 | .frames = 4, | ||
881 | .obj_attr_0 = OBJ_SHAPE_TALL, | ||
882 | .obj_attr_1 = OBJ_H_FLIP | OBJ_SIZE_MID, | ||
883 | .obj_attr_2 = 0 | ||
884 | }, | ||
885 | }, | ||
886 | }, | ||
887 | // RIGHT. | ||
888 | { | ||
889 | .frame = 0, | ||
890 | .n_obj = 3, | ||
891 | .n_frames = 8, | ||
892 | .state = BTN_STATE_RELEASED, | ||
893 | .animations = &btn_animation, | ||
894 | .sprites = &(ObjState[]){ | ||
895 | { | ||
896 | .id = 0, | ||
897 | .x = buttons_x - 64 - 16 + 11, | ||
898 | .y = buttons_y + 32 - 10, | ||
899 | .data = &gba_btn_leftright_data, | ||
900 | .n_tiles = 4, | ||
901 | .frames = 1, | ||
902 | .obj_attr_0 = 0, | ||
903 | .obj_attr_1 = OBJ_H_FLIP | OBJ_SIZE_MID, | ||
904 | .obj_attr_2 = 0 | ||
905 | }, | ||
906 | { | ||
907 | .id = 0, | ||
908 | .x = buttons_x - 64 - 16 + 11, | ||
909 | .y = buttons_y + 32 - 10 + 6, | ||
910 | .data = &gba_btn_leftright_shadow_data, | ||
911 | .n_tiles = 2, | ||
912 | .frames = 1, | ||
913 | .obj_attr_0 = OBJ_SHAPE_WIDE, | ||
914 | .obj_attr_1 = OBJ_H_FLIP | OBJ_SIZE_SMALL, | ||
915 | .obj_attr_2 = 0 | ||
916 | }, | ||
917 | { | ||
918 | .id = 0, | ||
919 | .x = buttons_x - 64 - 16 + 11 + 14, | ||
920 | .y = buttons_y + 32 - 10 - 8, | ||
921 | .data = &gba_btn_fx_leftright, | ||
922 | .n_tiles = 4, | ||
923 | .frames = 4, | ||
924 | .obj_attr_0 = OBJ_SHAPE_TALL, | ||
828 | .obj_attr_1 = OBJ_SIZE_MID, | 925 | .obj_attr_1 = OBJ_SIZE_MID, |
829 | .obj_attr_2 = 0 | 926 | .obj_attr_2 = 0 |
830 | }, | 927 | }, |
831 | }, | 928 | }, |
832 | }, | 929 | }, |
930 | |||
833 | }; | 931 | }; |
834 | for (size_t i = 0; i < sizeof(buttons) / sizeof(MultiSprite); ++i) { | 932 | for (size_t i = 0; i < sizeof(buttons) / sizeof(MultiSprite); ++i) { |
835 | init_button_sprite(&buttons[i]); | 933 | init_button_sprite(&buttons[i]); |
@@ -883,6 +981,27 @@ int main(void) { | |||
883 | } else { | 981 | } else { |
884 | buttons[0].state = BTN_STATE_RELEASED; | 982 | buttons[0].state = BTN_STATE_RELEASED; |
885 | } | 983 | } |
984 | if (key_pressed(KEY_UP)) { | ||
985 | buttons[1].state = BTN_STATE_PRESSED; | ||
986 | } else if (key_hold(KEY_UP)) { | ||
987 | buttons[1].state = BTN_STATE_HOLD; | ||
988 | } else { | ||
989 | buttons[1].state = BTN_STATE_RELEASED; | ||
990 | } | ||
991 | if (key_pressed(KEY_LEFT)) { | ||
992 | buttons[2].state = BTN_STATE_PRESSED; | ||
993 | } else if (key_hold(KEY_LEFT)) { | ||
994 | buttons[2].state = BTN_STATE_HOLD; | ||
995 | } else { | ||
996 | buttons[2].state = BTN_STATE_RELEASED; | ||
997 | } | ||
998 | if (key_pressed(KEY_RIGHT)) { | ||
999 | buttons[3].state = BTN_STATE_PRESSED; | ||
1000 | } else if (key_hold(KEY_RIGHT)) { | ||
1001 | buttons[3].state = BTN_STATE_HOLD; | ||
1002 | } else { | ||
1003 | buttons[3].state = BTN_STATE_RELEASED; | ||
1004 | } | ||
886 | 1005 | ||
887 | if (key_hold(KEY_DOWN)) { | 1006 | if (key_hold(KEY_DOWN)) { |
888 | y += 3; | 1007 | y += 3; |
@@ -897,14 +1016,6 @@ int main(void) { | |||
897 | x += 3; | 1016 | x += 3; |
898 | } | 1017 | } |
899 | 1018 | ||
900 | // OBJ_ATTR_2(btn_b.id) = sprites[btn_b.id].tile_start + animation_states[btn_b.state]->tile_offsets[btn_b.frame]; | ||
901 | // OBJ_ATTR_2(btn_a.id) = sprites[btn_a.id].tile_start + animation_states[btn_a.state]->tile_offsets[btn_a.frame]; | ||
902 | // OBJ_ATTR_2(btn_up.id) = sprites[btn_up.id].tile_start + animation_states[btn_up.state]->tile_offsets[btn_up.frame]; | ||
903 | // // OBJ_ATTR_2(btn_down.id) = sprites[btn_down.id].tile_start + animation_states[btn_down.state]->tile_offsets[btn_down.frame]; | ||
904 | // OBJ_ATTR_2(btn_left.id) = sprites[btn_left.id].tile_start + animation_states[btn_left.state]->tile_offsets[btn_left.frame]; | ||
905 | // OBJ_ATTR_2(btn_right.id) = sprites[btn_right.id].tile_start + animation_states[btn_right.state]->tile_offsets[btn_right.frame]; | ||
906 | // OBJ_ATTR_2(btn_l.id) = sprites[btn_l.id].tile_start + animation_states[btn_l.state]->tile_offsets[btn_l.frame]; | ||
907 | // OBJ_ATTR_2(btn_r.id) = sprites[btn_r.id].tile_start + animation_states[btn_r.state]->tile_offsets[btn_r.frame]; | ||
908 | frame_counter++; | 1019 | frame_counter++; |
909 | BG_H_SCROLL_0 = x; | 1020 | BG_H_SCROLL_0 = x; |
910 | BG_V_SCROLL_0 = y; | 1021 | BG_V_SCROLL_0 = y; |