Browse Source

add rotated ship sprite. basic 2-axis movement with 4-way rotation.

Thomas B 2 months ago
parent
commit
da3c51e464
9 changed files with 309 additions and 202 deletions
  1. 0
    0
      data/rockshp_0.png
  2. BIN
      data/rockshp_90.png
  3. 0
    0
      data/thrust_0.png
  4. BIN
      data/thrust_90.png
  5. 63
    202
      src/main.c
  6. 27
    0
      src/maps.c
  7. 14
    0
      src/maps.h
  8. 160
    0
      src/sprites.c
  9. 45
    0
      src/sprites.h

data/rockshp.png → data/rockshp_0.png View File


BIN
data/rockshp_90.png View File


data/thrustG.png → data/thrust_0.png View File


BIN
data/thrust_90.png View File


+ 63
- 202
src/main.c View File

@@ -2,6 +2,8 @@
2 2
  * main.c
3 3
  * Duality
4 4
  *
5
+ * Copyright (C) 2025 Thomas Buck <thomas@xythobuz.de>
6
+ *
5 7
  * Based on examples from gbdk-2020:
6 8
  * https://github.com/gbdk-2020/gbdk-2020/blob/develop/gbdk-lib/examples/cross-platform/metasprites/src/metasprites.c
7 9
  * https://github.com/gbdk-2020/gbdk-2020/blob/develop/gbdk-lib/examples/gb/galaxy/galaxy.c
@@ -13,35 +15,12 @@
13 15
 #include <rand.h>
14 16
 #include <stdint.h>
15 17
 
16
-#include "title_map.h"
17
-#include "bg_map.h"
18
-#include "rockshp.h"
19
-#include "thrustG.h"
20
-#include "light.h"
21
-#include "dark.h"
22
-#include "shoot.h"
23
-
24
-#define TILE_WIDTH          8
25
-#define TILE_HEIGHT         8
26
-#define NUM_BYTES_PER_TILE  16
27
-
28
-#define ACC_X 1
29
-#define ACC_Y 2
18
+#include "maps.h"
19
+#include "sprites.h"
30 20
 
31 21
 // The metasprite will be built starting with hardware sprite zero (the first)
32 22
 #define SPR_NUM_START 0
33 23
 
34
-// Metasprite tiles are loaded into VRAM starting at tile number 0
35
-#define TILE_NUM_START 0
36
-
37
-static int16_t PosX = 0;
38
-static int16_t PosY = 0;
39
-static int16_t SpdX = 0;
40
-static int16_t SpdY = 0;
41
-static uint8_t PosF = 0;
42
-
43
-static uint8_t rot = 0;
44
-
45 24
 static uint8_t joyp = 0;
46 25
 static uint8_t old_joyp = 0;
47 26
 
@@ -49,122 +28,21 @@ static uint8_t old_joyp = 0;
49 28
 #define KEY_DOWN(KEY) (joyp & (KEY))
50 29
 #define KEY_PRESSED(KEY) ((joyp ^ old_joyp) & joyp & (KEY))
51 30
 
52
-struct sprites {
53
-    const metasprite_t * const * ms;
54
-    const uint8_t * ti;
55
-    const palette_color_t * pa;
56
-    uint8_t cnt;
57
-    uint8_t off;
31
+enum ACCELERATION {
32
+    ACC_X = 1,
33
+    ACC_Y = 2,
34
+    ACC_R = 4,
58 35
 };
59 36
 
60
-#define SPR_SHIP 0
61
-#define SPR_THRUST 1
62
-#define SPR_LIGHT 2
63
-#define SPR_DARK 3
64
-#define SPR_SHOT 4
65
-#define SPRITE_COUNT 5
66
-
67
-struct sprites metasprites[SPRITE_COUNT] = {
68
-    {
69
-        .ms = rockshp_metasprites,
70
-        .ti = rockshp_tiles,
71
-        .pa = rockshp_palettes,
72
-        .cnt = rockshp_TILE_COUNT,
73
-        .off = TILE_NUM_START
74
-    }, {
75
-        .ms = thrustG_metasprites,
76
-        .ti = thrustG_tiles,
77
-        .pa = thrustG_palettes,
78
-        .cnt = thrustG_TILE_COUNT,
79
-        .off = TILE_NUM_START
80
-    }, {
81
-        .ms = light_metasprites,
82
-        .ti = light_tiles,
83
-        .pa = light_palettes,
84
-        .cnt = light_TILE_COUNT,
85
-        .off = TILE_NUM_START
86
-    }, {
87
-        .ms = dark_metasprites,
88
-        .ti = dark_tiles,
89
-        .pa = dark_palettes,
90
-        .cnt = dark_TILE_COUNT,
91
-        .off = TILE_NUM_START
92
-    }, {
93
-        .ms = shoot_metasprites,
94
-        .ti = shoot_tiles,
95
-        .pa = shoot_palettes,
96
-        .cnt = shoot_TILE_COUNT,
97
-        .off = TILE_NUM_START
98
-    }
99
-};
100
-
101
-static void draw(uint8_t sprite, uint8_t *hiwater, int8_t y_off) {
102
-    switch (rot & 0x3) {
103
-        case 1:
104
-            *hiwater += move_metasprite_flipy(
105
-                    metasprites[sprite].ms[0], metasprites[sprite].off,
106
-                    OAMF_CGB_PAL0 + sprite, *hiwater,
107
-                    DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2),
108
-                    DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
109
-            break;
110
-
111
-        case 2:
112
-            *hiwater += move_metasprite_flipxy(
113
-                    metasprites[sprite].ms[0], metasprites[sprite].off,
114
-                    OAMF_CGB_PAL0 + sprite, *hiwater,
115
-                    DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2),
116
-                    DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
117
-            break;
118
-
119
-        case 3:
120
-            *hiwater += move_metasprite_flipx(
121
-                    metasprites[sprite].ms[0], metasprites[sprite].off,
122
-                    OAMF_CGB_PAL0 + sprite, *hiwater,
123
-                    DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2),
124
-                    DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
125
-            break;
126
-
127
-        default:
128
-            *hiwater += move_metasprite_ex(
129
-                    metasprites[sprite].ms[0], metasprites[sprite].off,
130
-                    OAMF_CGB_PAL0 + sprite, *hiwater,
131
-                    DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2),
132
-                    DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
133
-            break;
134
-    }
135
-}
136
-
137
-static void ship(uint8_t *hiwater) {
138
-    switch (rot & 0x3) {
139
-        case 1:
140
-        case 2:
141
-            draw(SPR_SHIP, hiwater, 0);
142
-            if (PosF) {
143
-                draw(SPR_THRUST, hiwater, -8 - 4);
144
-            }
145
-            break;
146
-
147
-        case 3:
148
-        default:
149
-            draw(SPR_SHIP, hiwater, 0);
150
-            if (PosF) {
151
-                draw(SPR_THRUST, hiwater, 8 + 4);
152
-            }
153
-            break;
154
-    }
155
-}
37
+#define SPEED_INC 1
38
+#define SPEED_MAX 16
156 39
 
157 40
 static void splash(void) {
158 41
     disable_interrupts();
159 42
     DISPLAY_OFF;
160 43
 
161 44
     set_default_palette();
162
-
163
-    // title_map as background map
164
-    set_bkg_palette(OAMF_CGB_PAL0, title_map_PALETTE_COUNT, title_map_palettes);
165
-    set_bkg_data(0, bg_map_TILE_COUNT, title_map_tiles);
166
-    set_bkg_attributes(0, 0, title_map_MAP_ATTRIBUTES_WIDTH, title_map_MAP_ATTRIBUTES_HEIGHT, title_map_MAP_ATTRIBUTES);
167
-    set_bkg_tiles(0, 0, title_map_WIDTH / title_map_TILE_W, title_map_HEIGHT / title_map_TILE_H, title_map_map);
45
+    map_title();
168 46
 
169 47
     SHOW_BKG;
170 48
     DISPLAY_ON;
@@ -184,22 +62,8 @@ static void game(void) {
184 62
     DISPLAY_OFF;
185 63
 
186 64
     set_default_palette();
187
-
188
-    // bg_map as background map
189
-    set_bkg_palette(OAMF_CGB_PAL0, bg_map_PALETTE_COUNT, bg_map_palettes);
190
-    set_bkg_data(0, bg_map_TILE_COUNT, bg_map_tiles);
191
-    set_bkg_attributes(0, 0, bg_map_MAP_ATTRIBUTES_WIDTH, bg_map_MAP_ATTRIBUTES_HEIGHT, bg_map_MAP_ATTRIBUTES);
192
-    set_bkg_tiles(0, 0, bg_map_WIDTH / bg_map_TILE_W, bg_map_HEIGHT / bg_map_TILE_H, bg_map_map);
193
-
194
-    // metasprites
195
-    uint8_t off = TILE_NUM_START;
196
-    for (int i = 0; i < (sizeof(metasprites) / sizeof(metasprites[0])); i++) {
197
-        metasprites[i].off = off;
198
-        off += metasprites[i].cnt;
199
-
200
-        set_sprite_palette(OAMF_CGB_PAL0 + i, 1, metasprites[i].pa);
201
-        set_sprite_data(metasprites[i].off, metasprites[i].cnt, metasprites[i].ti);
202
-    }
65
+    map_game();
66
+    spr_init();
203 67
 
204 68
     SHOW_BKG;
205 69
     SHOW_SPRITES;
@@ -207,73 +71,70 @@ static void game(void) {
207 71
     DISPLAY_ON;
208 72
     enable_interrupts();
209 73
 
74
+    int16_t PosX = 0;
75
+    int16_t PosY = 0;
76
+    int16_t SpdX = 0;
77
+    int16_t SpdY = 0;
78
+    enum SPRITE_ROT rot = 0;
79
+    enum ACCELERATION prev_acc = 0xFF; // so we draw the ship on the first frame
80
+
210 81
     while(1) {
211 82
         KEY_INPUT;
212 83
 
213
-        PosF = 0;
84
+        enum ACCELERATION acc = 0;
214 85
 
215
-        // Game object
216
-        if (KEY_DOWN(J_UP)) {
217
-            SpdY -= 2;
218
-            if (SpdY < -32) SpdY = -32;
219
-            PosF |= ACC_Y;
220
-        } else if (KEY_DOWN(J_DOWN)) {
221
-            SpdY += 2;
222
-            if (SpdY > 32) SpdY = 32;
223
-            PosF |= ACC_Y;
86
+        if (KEY_PRESSED(J_LEFT)) {
87
+            rot = (rot - 1) & (ROT_INVALID - 1);
88
+            acc |= ACC_R;
89
+        } else if (KEY_PRESSED(J_RIGHT)) {
90
+            rot = (rot + 1) & (ROT_INVALID - 1);
91
+            acc |= ACC_R;
224 92
         }
225 93
 
226
-        if (KEY_DOWN(J_LEFT)) {
227
-            SpdX -= 2;
228
-            if (SpdX < -32) SpdX = -32;
229
-            PosF |= ACC_X;
230
-        } else if (KEY_DOWN(J_RIGHT)) {
231
-            SpdX += 2;
232
-            if (SpdX > 32) SpdX = 32;
233
-            PosF |= ACC_X;
234
-        }
235
-
236
-        if (KEY_PRESSED(J_A)) {
237
-            // TODO shoot
238
-        }
239
-
240
-        if (KEY_PRESSED(J_B)) {
241
-            rot++; rot &= 0x3;
94
+        if (KEY_DOWN(J_A)) {
95
+            switch (rot) {
96
+                case ROT_0:
97
+                    SpdY -= SPEED_INC;
98
+                    if (SpdY < -SPEED_MAX) SpdY = -SPEED_MAX;
99
+                    acc |= ACC_Y;
100
+                    break;
101
+
102
+                case ROT_90:
103
+                    SpdX += SPEED_INC;
104
+                    if (SpdX > SPEED_MAX) SpdX = SPEED_MAX;
105
+                    acc |= ACC_X;
106
+                    break;
107
+
108
+                case ROT_180:
109
+                    SpdY += SPEED_INC;
110
+                    if (SpdY > SPEED_MAX) SpdY = SPEED_MAX;
111
+                    acc |= ACC_Y;
112
+                    break;
113
+
114
+                case ROT_270:
115
+                    SpdX -= SPEED_INC;
116
+                    if (SpdX < -SPEED_MAX) SpdX = -SPEED_MAX;
117
+                    acc |= ACC_X;
118
+                    break;
119
+
120
+                default:
121
+                    break;
122
+            }
242 123
         }
243 124
 
244 125
         PosX += SpdX;
245 126
         PosY += SpdY;
246 127
 
247
-        // Y Axis: update velocity (reduce speed) if no U/D button pressed
248
-        if (!(PosF & ACC_Y)) {
249
-            if (SpdY != 0) {
250
-                if (SpdY > 0) SpdY--;
251
-                else SpdY ++;
252
-            }
253
-        }
254
-
255
-        // X Axis: update velocity (reduce speed) if no L/R button pressed
256
-        if (!(PosF & ACC_X)) {
257
-            if (SpdX != 0) {
258
-                if (SpdX > 0) SpdX--;
259
-                else SpdX ++;
260
-            }
261
-        }
262
-
263 128
         move_bkg(PosX >> 4, PosY >> 4);
264 129
 
265
-        uint8_t hiwater = SPR_NUM_START;
266
-
267
-        // NOTE: In a real game it would be better to only call the move_metasprite..()
268
-        //       functions if something changed (such as movement or rotation). That
269
-        //       reduces CPU usage on frames that don't need updates.
270
-        //
271
-        // In this example they are called every frame to simplify the example code
272
-
273
-        ship(&hiwater);
130
+        // re-draw ship sprite when we've just rotated or are starting or stopping acceleration
131
+        if ((acc & ACC_R) || ((prev_acc & (ACC_X | ACC_Y)) != (acc & (ACC_X | ACC_Y)))) {
132
+            uint8_t hiwater = SPR_NUM_START;
133
+            spr_ship(rot, acc & (ACC_X | ACC_Y), &hiwater);
134
+            hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
135
+        }
274 136
 
275
-        // Hide rest of the hardware sprites, because amount of sprites differ between animation frames.
276
-        hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
137
+        prev_acc = acc;
277 138
 
278 139
         vsync();
279 140
     }

+ 27
- 0
src/maps.c View File

@@ -0,0 +1,27 @@
1
+/*
2
+ * maps.c
3
+ * Duality
4
+ *
5
+ * Copyright (C) 2025 Thomas Buck <thomas@xythobuz.de>
6
+ */
7
+
8
+#include <gbdk/platform.h>
9
+
10
+#include "maps.h"
11
+
12
+#include "title_map.h"
13
+#include "bg_map.h"
14
+
15
+void map_title(void) {
16
+    set_bkg_palette(OAMF_CGB_PAL0, title_map_PALETTE_COUNT, title_map_palettes);
17
+    set_bkg_data(0, title_map_TILE_COUNT, title_map_tiles);
18
+    set_bkg_attributes(0, 0, title_map_MAP_ATTRIBUTES_WIDTH, title_map_MAP_ATTRIBUTES_HEIGHT, title_map_MAP_ATTRIBUTES);
19
+    set_bkg_tiles(0, 0, title_map_WIDTH / title_map_TILE_W, title_map_HEIGHT / title_map_TILE_H, title_map_map);
20
+}
21
+
22
+void map_game(void) {
23
+    set_bkg_palette(OAMF_CGB_PAL0, bg_map_PALETTE_COUNT, bg_map_palettes);
24
+    set_bkg_data(0, bg_map_TILE_COUNT, bg_map_tiles);
25
+    set_bkg_attributes(0, 0, bg_map_MAP_ATTRIBUTES_WIDTH, bg_map_MAP_ATTRIBUTES_HEIGHT, bg_map_MAP_ATTRIBUTES);
26
+    set_bkg_tiles(0, 0, bg_map_WIDTH / bg_map_TILE_W, bg_map_HEIGHT / bg_map_TILE_H, bg_map_map);
27
+}

+ 14
- 0
src/maps.h View File

@@ -0,0 +1,14 @@
1
+/*
2
+ * maps.h
3
+ * Duality
4
+ *
5
+ * Copyright (C) 2025 Thomas Buck <thomas@xythobuz.de>
6
+ */
7
+
8
+#ifndef __MAPS_H__
9
+#define __MAPS_H__
10
+
11
+void map_title(void);
12
+void map_game(void);
13
+
14
+#endif // __MAPS_H__

+ 160
- 0
src/sprites.c View File

@@ -0,0 +1,160 @@
1
+/*
2
+ * sprites.c
3
+ * Duality
4
+ *
5
+ * Copyright (C) 2025 Thomas Buck <thomas@xythobuz.de>
6
+ */
7
+
8
+#include <gbdk/platform.h>
9
+#include <gbdk/metasprites.h>
10
+#include <stdint.h>
11
+
12
+#include "sprites.h"
13
+
14
+#include "rockshp_0.h"
15
+#include "rockshp_90.h"
16
+#include "thrust_0.h"
17
+#include "thrust_90.h"
18
+#include "light.h"
19
+#include "dark.h"
20
+#include "shoot.h"
21
+
22
+// Metasprite tiles are loaded into VRAM starting at tile number 0
23
+#define TILE_NUM_START 0
24
+
25
+struct sprites {
26
+    const metasprite_t * const * ms;
27
+    const uint8_t * ti;
28
+    const palette_color_t * pa;
29
+    uint8_t cnt;
30
+    uint8_t off;
31
+};
32
+
33
+static struct sprites metasprites[SPRITE_COUNT] = {
34
+    {
35
+        .ms = rockshp_0_metasprites,
36
+        .ti = rockshp_0_tiles,
37
+        .pa = rockshp_0_palettes,
38
+        .cnt = rockshp_0_TILE_COUNT,
39
+        .off = TILE_NUM_START
40
+    }, {
41
+        .ms = rockshp_90_metasprites,
42
+        .ti = rockshp_90_tiles,
43
+        .pa = rockshp_90_palettes,
44
+        .cnt = rockshp_90_TILE_COUNT,
45
+        .off = TILE_NUM_START
46
+    }, {
47
+        .ms = thrust_0_metasprites,
48
+        .ti = thrust_0_tiles,
49
+        .pa = thrust_0_palettes,
50
+        .cnt = thrust_0_TILE_COUNT,
51
+        .off = TILE_NUM_START
52
+    }, {
53
+        .ms = thrust_90_metasprites,
54
+        .ti = thrust_90_tiles,
55
+        .pa = thrust_90_palettes,
56
+        .cnt = thrust_90_TILE_COUNT,
57
+        .off = TILE_NUM_START
58
+    }, {
59
+        .ms = light_metasprites,
60
+        .ti = light_tiles,
61
+        .pa = light_palettes,
62
+        .cnt = light_TILE_COUNT,
63
+        .off = TILE_NUM_START
64
+    }, {
65
+        .ms = dark_metasprites,
66
+        .ti = dark_tiles,
67
+        .pa = dark_palettes,
68
+        .cnt = dark_TILE_COUNT,
69
+        .off = TILE_NUM_START
70
+    }, {
71
+        .ms = shoot_metasprites,
72
+        .ti = shoot_tiles,
73
+        .pa = shoot_palettes,
74
+        .cnt = shoot_TILE_COUNT,
75
+        .off = TILE_NUM_START
76
+    }
77
+};
78
+
79
+void spr_init(void) {
80
+    uint8_t off = TILE_NUM_START;
81
+    for (int i = 0; i < (sizeof(metasprites) / sizeof(metasprites[0])); i++) {
82
+        metasprites[i].off = off;
83
+        off += metasprites[i].cnt;
84
+
85
+        set_sprite_palette(OAMF_CGB_PAL0 + i, 1, metasprites[i].pa);
86
+        set_sprite_data(metasprites[i].off, metasprites[i].cnt, metasprites[i].ti);
87
+    }
88
+}
89
+
90
+void spr_draw(uint8_t sprite, uint8_t *hiwater, enum SPRITE_FLIP flip, int8_t x_off, int8_t y_off) {
91
+    switch (flip) {
92
+        case FLIP_Y:
93
+            *hiwater += move_metasprite_flipy(
94
+                    metasprites[sprite].ms[0], metasprites[sprite].off,
95
+                    OAMF_CGB_PAL0 + sprite, *hiwater,
96
+                    DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
97
+                    DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
98
+            break;
99
+
100
+        case FLIP_XY:
101
+            *hiwater += move_metasprite_flipxy(
102
+                    metasprites[sprite].ms[0], metasprites[sprite].off,
103
+                    OAMF_CGB_PAL0 + sprite, *hiwater,
104
+                    DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
105
+                    DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
106
+            break;
107
+
108
+        case FLIP_X:
109
+            *hiwater += move_metasprite_flipx(
110
+                    metasprites[sprite].ms[0], metasprites[sprite].off,
111
+                    OAMF_CGB_PAL0 + sprite, *hiwater,
112
+                    DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
113
+                    DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
114
+            break;
115
+
116
+        case FLIP_NONE:
117
+        default:
118
+            *hiwater += move_metasprite_ex(
119
+                    metasprites[sprite].ms[0], metasprites[sprite].off,
120
+                    OAMF_CGB_PAL0 + sprite, *hiwater,
121
+                    DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) + x_off,
122
+                    DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2) + y_off);
123
+            break;
124
+    }
125
+}
126
+
127
+void spr_ship(enum SPRITE_ROT rot, uint8_t moving, uint8_t *hiwater) {
128
+    switch (rot) {
129
+        case ROT_0:
130
+            spr_draw(SPR_SHIP_0, hiwater, FLIP_NONE, 0, 0);
131
+            if (moving) {
132
+                spr_draw(SPR_THRUST_0, hiwater, FLIP_NONE, 0, 8 + 4);
133
+            }
134
+            break;
135
+
136
+        case ROT_90:
137
+            spr_draw(SPR_SHIP_90, hiwater, FLIP_NONE, 0, 0);
138
+            if (moving) {
139
+                spr_draw(SPR_THRUST_90, hiwater, FLIP_NONE, -8 - 4, 0);
140
+            }
141
+            break;
142
+
143
+        case ROT_180:
144
+            spr_draw(SPR_SHIP_0, hiwater, FLIP_Y, 0, 0);
145
+            if (moving) {
146
+                spr_draw(SPR_THRUST_0, hiwater, FLIP_Y, 0, -8 - 4);
147
+            }
148
+            break;
149
+
150
+        case ROT_270:
151
+            spr_draw(SPR_SHIP_90, hiwater, FLIP_X, 0, 0);
152
+            if (moving) {
153
+                spr_draw(SPR_THRUST_90, hiwater, FLIP_X, 8 + 4, 0);
154
+            }
155
+            break;
156
+
157
+        default:
158
+            break;
159
+    }
160
+}

+ 45
- 0
src/sprites.h View File

@@ -0,0 +1,45 @@
1
+/*
2
+ * sprites.h
3
+ * Duality
4
+ *
5
+ * Copyright (C) 2025 Thomas Buck <thomas@xythobuz.de>
6
+ */
7
+
8
+#ifndef __SPRITES_H__
9
+#define __SPRITES_H__
10
+
11
+#include <stdint.h>
12
+
13
+enum SPRITES {
14
+    SPR_SHIP_0 = 0,
15
+    SPR_SHIP_90,
16
+    SPR_THRUST_0,
17
+    SPR_THRUST_90,
18
+    SPR_LIGHT,
19
+    SPR_DARK,
20
+    SPR_SHOT,
21
+
22
+    SPRITE_COUNT
23
+};
24
+
25
+enum SPRITE_FLIP {
26
+    FLIP_NONE = 0,
27
+    FLIP_X,
28
+    FLIP_Y,
29
+    FLIP_XY
30
+};
31
+
32
+enum SPRITE_ROT {
33
+    ROT_0 = 0,
34
+    ROT_90,
35
+    ROT_180,
36
+    ROT_270,
37
+
38
+    ROT_INVALID
39
+};
40
+
41
+void spr_init(void);
42
+void spr_draw(uint8_t sprite, uint8_t *hiwater, enum SPRITE_FLIP flip, int8_t x_off, int8_t y_off);
43
+void spr_ship(enum SPRITE_ROT rot, uint8_t moving, uint8_t *hiwater);
44
+
45
+#endif // __SPRITES_H__

Loading…
Cancel
Save