summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-04-23 23:35:44 +0200
committerBad Diode <bd@badd10de.dev>2021-04-23 23:35:44 +0200
commit30a7de0d7bfd4b076a57a029a08ce1fd9eccd429 (patch)
treea59a07dca278c1ff96eb5780df4ea2a580cb015e
parentf652b2a9c76194ee285e001e6b04a7dc585e8993 (diff)
downloadgba-experiments-30a7de0d7bfd4b076a57a029a08ce1fd9eccd429.tar.gz
gba-experiments-30a7de0d7bfd4b076a57a029a08ce1fd9eccd429.zip
Add new animations for dpad
-rw-r--r--src/gba-buttons.c57
-rw-r--r--src/main.c199
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[] = {
55u32 gba_btn_fx_downup[] = { 55u32 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
66u32 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
66typedef struct SpriteAnimation { 77typedef 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
112AnimationEntry *btn_down_animation[] = { 123AnimationEntry *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};
diff --git a/src/main.c b/src/main.c
index e74df00..787d39b 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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;