Browse Source

add basic shooting

Thomas B 2 months ago
parent
commit
5a0ac83ec8
5 changed files with 155 additions and 11 deletions
  1. 42
    4
      src/main.c
  2. 79
    0
      src/obj.c
  3. 26
    0
      src/obj.h
  4. 5
    6
      src/sprites.c
  5. 3
    1
      src/sprites.h

+ 42
- 4
src/main.c View File

16
 #include <stdint.h>
16
 #include <stdint.h>
17
 
17
 
18
 #include "maps.h"
18
 #include "maps.h"
19
+#include "obj.h"
19
 #include "sprites.h"
20
 #include "sprites.h"
20
 
21
 
21
 // The metasprite will be built starting with hardware sprite zero (the first)
22
 // The metasprite will be built starting with hardware sprite zero (the first)
36
 
37
 
37
 #define SPEED_INC 1
38
 #define SPEED_INC 1
38
 #define SPEED_MAX 16
39
 #define SPEED_MAX 16
40
+#define SHOT_SPEED 8
39
 
41
 
40
 static void splash(void) {
42
 static void splash(void) {
41
     disable_interrupts();
43
     disable_interrupts();
63
 
65
 
64
     set_default_palette();
66
     set_default_palette();
65
     map_game();
67
     map_game();
66
-    spr_init();
67
 
68
 
68
     SHOW_BKG;
69
     SHOW_BKG;
70
+
71
+    spr_init();
72
+    obj_init();
73
+
69
     SHOW_SPRITES;
74
     SHOW_SPRITES;
70
     SPRITES_8x8;
75
     SPRITES_8x8;
71
     DISPLAY_ON;
76
     DISPLAY_ON;
77
     int16_t SpdY = 0;
82
     int16_t SpdY = 0;
78
     enum SPRITE_ROT rot = 0;
83
     enum SPRITE_ROT rot = 0;
79
     enum ACCELERATION prev_acc = 0xFF; // so we draw the ship on the first frame
84
     enum ACCELERATION prev_acc = 0xFF; // so we draw the ship on the first frame
85
+    uint8_t ship_hiwater = 0;
86
+
87
+    // TODO remove
88
+    obj_add(SPR_LIGHT, 64, 64, 0, 0);
89
+    obj_add(SPR_DARK, -64, -64, 0, 0);
80
 
90
 
81
     while(1) {
91
     while(1) {
82
         KEY_INPUT;
92
         KEY_INPUT;
122
             }
132
             }
123
         }
133
         }
124
 
134
 
135
+        if (KEY_PRESSED(J_B)) {
136
+            switch (rot) {
137
+                case ROT_0:
138
+                    obj_add(SPR_SHOT, 0, -SHIP_OFF, 0, -SHOT_SPEED);
139
+                break;
140
+
141
+                case ROT_90:
142
+                    obj_add(SPR_SHOT, SHIP_OFF, 0, SHOT_SPEED, 0);
143
+                break;
144
+
145
+                case ROT_180:
146
+                    obj_add(SPR_SHOT, 0, SHIP_OFF, 0, SHOT_SPEED);
147
+                break;
148
+
149
+                case ROT_270:
150
+                    obj_add(SPR_SHOT, -SHIP_OFF, 0, -SHOT_SPEED, 0);
151
+                break;
152
+
153
+                default:
154
+                    break;
155
+            }
156
+        }
157
+
125
         PosX += SpdX;
158
         PosX += SpdX;
126
         PosY += SpdY;
159
         PosY += SpdY;
127
-
128
         move_bkg(PosX >> 4, PosY >> 4);
160
         move_bkg(PosX >> 4, PosY >> 4);
129
 
161
 
162
+        uint8_t hiwater = SPR_NUM_START;
163
+
130
         // re-draw ship sprite when we've just rotated or are starting or stopping acceleration
164
         // 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)))) {
165
         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);
166
             spr_ship(rot, acc & (ACC_X | ACC_Y), &hiwater);
134
-            hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
167
+            ship_hiwater = hiwater;
168
+        } else {
169
+            hiwater = ship_hiwater;
135
         }
170
         }
136
 
171
 
172
+        obj_draw(SpdX, SpdY, &hiwater);
173
+        hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
174
+
137
         prev_acc = acc;
175
         prev_acc = acc;
138
 
176
 
139
         vsync();
177
         vsync();

+ 79
- 0
src/obj.c View File

1
+/*
2
+ * obj.c
3
+ * Duality
4
+ *
5
+ * Copyright (C) 2025 Thomas Buck <thomas@xythobuz.de>
6
+ *
7
+ * Based on examples from gbdk-2020:
8
+ * https://github.com/gbdk-2020/gbdk-2020/blob/develop/gbdk-lib/examples/cross-platform/metasprites/src/metasprites.c
9
+ * https://github.com/gbdk-2020/gbdk-2020/blob/develop/gbdk-lib/examples/gb/galaxy/galaxy.c
10
+ * https://github.com/gbdk-2020/gbdk-2020/blob/develop/gbdk-lib/examples/gb/rand/rand.c
11
+ */
12
+
13
+#include <gbdk/platform.h>
14
+#include <string.h>
15
+#include <stdlib.h>
16
+
17
+#include "obj.h"
18
+#include "sprites.h"
19
+
20
+#define MAX_OBJ 10
21
+#define MAX_TRAVEL 2000
22
+
23
+struct obj {
24
+    uint8_t active;
25
+    enum SPRITES sprite;
26
+    int16_t off_x;
27
+    int16_t off_y;
28
+    int16_t spd_x;
29
+    int16_t spd_y;
30
+    uint16_t travel;
31
+};
32
+
33
+static struct obj objs[MAX_OBJ];
34
+
35
+void obj_init(void) {
36
+    memset(objs, 0, sizeof(objs));
37
+}
38
+
39
+int8_t obj_add(enum SPRITES sprite, int16_t off_x, int16_t off_y, int16_t spd_x, int16_t spd_y) {
40
+    uint8_t obj_cnt = 0xFF;
41
+    for (uint8_t i = 0; i < MAX_OBJ; i++) {
42
+        if (!objs[i].active) {
43
+            obj_cnt = i;
44
+            break;
45
+        }
46
+    }
47
+    if (obj_cnt >= MAX_OBJ) {
48
+        return OBJ_LIST_FULL;
49
+    }
50
+
51
+    objs[obj_cnt].active = 1;
52
+    objs[obj_cnt].sprite = sprite;
53
+    objs[obj_cnt].off_x = off_x << 4;
54
+    objs[obj_cnt].off_y = off_y << 4;
55
+    objs[obj_cnt].spd_x = spd_x;
56
+    objs[obj_cnt].spd_y = spd_y;
57
+    objs[obj_cnt].travel = 0;
58
+
59
+    obj_cnt += 1;
60
+    return OBJ_ADDED;
61
+}
62
+
63
+void obj_draw(int16_t spd_x, int16_t spd_y, uint8_t *hiwater) {
64
+    for (uint8_t i = 0; i < MAX_OBJ; i++) {
65
+        if (!objs[i].active) {
66
+            continue;
67
+        }
68
+
69
+        spr_draw(objs[i].sprite, hiwater, FLIP_NONE, objs[i].off_x >> 4, objs[i].off_y >> 4);
70
+
71
+        objs[i].off_x += objs[i].spd_x - spd_x;
72
+        objs[i].off_y += objs[i].spd_y - spd_y;
73
+
74
+        objs[i].travel += abs(objs[i].spd_x) + abs(objs[i].spd_y);
75
+        if (objs[i].travel >= MAX_TRAVEL) {
76
+            objs[i].active = 0;
77
+        }
78
+    }
79
+}

+ 26
- 0
src/obj.h View File

1
+/*
2
+ * obj.h
3
+ * Duality
4
+ *
5
+ * Copyright (C) 2025 Thomas Buck <thomas@xythobuz.de>
6
+ *
7
+ * Based on examples from gbdk-2020:
8
+ * https://github.com/gbdk-2020/gbdk-2020/blob/develop/gbdk-lib/examples/cross-platform/metasprites/src/metasprites.c
9
+ * https://github.com/gbdk-2020/gbdk-2020/blob/develop/gbdk-lib/examples/gb/galaxy/galaxy.c
10
+ * https://github.com/gbdk-2020/gbdk-2020/blob/develop/gbdk-lib/examples/gb/rand/rand.c
11
+ */
12
+
13
+#ifndef __OBJ_H__
14
+#define __OBJ_H__
15
+
16
+#include <stdint.h>
17
+#include "sprites.h"
18
+
19
+#define OBJ_ADDED 0
20
+#define OBJ_LIST_FULL -1
21
+
22
+void obj_init(void);
23
+int8_t obj_add(enum SPRITES sprite, int16_t off_x, int16_t off_y, int16_t spd_x, int16_t spd_y);
24
+void obj_draw(int16_t spd_x, int16_t spd_y, uint8_t *hiwater);
25
+
26
+#endif // __OBJ_H__

+ 5
- 6
src/sprites.c View File

7
 
7
 
8
 #include <gbdk/platform.h>
8
 #include <gbdk/platform.h>
9
 #include <gbdk/metasprites.h>
9
 #include <gbdk/metasprites.h>
10
-#include <stdint.h>
11
 
10
 
12
 #include "sprites.h"
11
 #include "sprites.h"
13
 
12
 
87
     }
86
     }
88
 }
87
 }
89
 
88
 
90
-void spr_draw(uint8_t sprite, uint8_t *hiwater, enum SPRITE_FLIP flip, int8_t x_off, int8_t y_off) {
89
+void spr_draw(enum SPRITES sprite, uint8_t *hiwater, enum SPRITE_FLIP flip, int8_t x_off, int8_t y_off) {
91
     switch (flip) {
90
     switch (flip) {
92
         case FLIP_Y:
91
         case FLIP_Y:
93
             *hiwater += move_metasprite_flipy(
92
             *hiwater += move_metasprite_flipy(
129
         case ROT_0:
128
         case ROT_0:
130
             spr_draw(SPR_SHIP_0, hiwater, FLIP_NONE, 0, 0);
129
             spr_draw(SPR_SHIP_0, hiwater, FLIP_NONE, 0, 0);
131
             if (moving) {
130
             if (moving) {
132
-                spr_draw(SPR_THRUST_0, hiwater, FLIP_NONE, 0, 8 + 4);
131
+                spr_draw(SPR_THRUST_0, hiwater, FLIP_NONE, 0, SHIP_OFF);
133
             }
132
             }
134
             break;
133
             break;
135
 
134
 
136
         case ROT_90:
135
         case ROT_90:
137
             spr_draw(SPR_SHIP_90, hiwater, FLIP_NONE, 0, 0);
136
             spr_draw(SPR_SHIP_90, hiwater, FLIP_NONE, 0, 0);
138
             if (moving) {
137
             if (moving) {
139
-                spr_draw(SPR_THRUST_90, hiwater, FLIP_NONE, -8 - 4, 0);
138
+                spr_draw(SPR_THRUST_90, hiwater, FLIP_NONE, -SHIP_OFF, 0);
140
             }
139
             }
141
             break;
140
             break;
142
 
141
 
143
         case ROT_180:
142
         case ROT_180:
144
             spr_draw(SPR_SHIP_0, hiwater, FLIP_Y, 0, 0);
143
             spr_draw(SPR_SHIP_0, hiwater, FLIP_Y, 0, 0);
145
             if (moving) {
144
             if (moving) {
146
-                spr_draw(SPR_THRUST_0, hiwater, FLIP_Y, 0, -8 - 4);
145
+                spr_draw(SPR_THRUST_0, hiwater, FLIP_Y, 0, -SHIP_OFF);
147
             }
146
             }
148
             break;
147
             break;
149
 
148
 
150
         case ROT_270:
149
         case ROT_270:
151
             spr_draw(SPR_SHIP_90, hiwater, FLIP_X, 0, 0);
150
             spr_draw(SPR_SHIP_90, hiwater, FLIP_X, 0, 0);
152
             if (moving) {
151
             if (moving) {
153
-                spr_draw(SPR_THRUST_90, hiwater, FLIP_X, 8 + 4, 0);
152
+                spr_draw(SPR_THRUST_90, hiwater, FLIP_X, SHIP_OFF, 0);
154
             }
153
             }
155
             break;
154
             break;
156
 
155
 

+ 3
- 1
src/sprites.h View File

10
 
10
 
11
 #include <stdint.h>
11
 #include <stdint.h>
12
 
12
 
13
+#define SHIP_OFF (8 + 4)
14
+
13
 enum SPRITES {
15
 enum SPRITES {
14
     SPR_SHIP_0 = 0,
16
     SPR_SHIP_0 = 0,
15
     SPR_SHIP_90,
17
     SPR_SHIP_90,
39
 };
41
 };
40
 
42
 
41
 void spr_init(void);
43
 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);
44
+void spr_draw(enum SPRITES 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);
45
 void spr_ship(enum SPRITE_ROT rot, uint8_t moving, uint8_t *hiwater);
44
 
46
 
45
 #endif // __SPRITES_H__
47
 #endif // __SPRITES_H__

Loading…
Cancel
Save