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,6 +16,7 @@
16 16
 #include <stdint.h>
17 17
 
18 18
 #include "maps.h"
19
+#include "obj.h"
19 20
 #include "sprites.h"
20 21
 
21 22
 // The metasprite will be built starting with hardware sprite zero (the first)
@@ -36,6 +37,7 @@ enum ACCELERATION {
36 37
 
37 38
 #define SPEED_INC 1
38 39
 #define SPEED_MAX 16
40
+#define SHOT_SPEED 8
39 41
 
40 42
 static void splash(void) {
41 43
     disable_interrupts();
@@ -63,9 +65,12 @@ static void game(void) {
63 65
 
64 66
     set_default_palette();
65 67
     map_game();
66
-    spr_init();
67 68
 
68 69
     SHOW_BKG;
70
+
71
+    spr_init();
72
+    obj_init();
73
+
69 74
     SHOW_SPRITES;
70 75
     SPRITES_8x8;
71 76
     DISPLAY_ON;
@@ -77,6 +82,11 @@ static void game(void) {
77 82
     int16_t SpdY = 0;
78 83
     enum SPRITE_ROT rot = 0;
79 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 91
     while(1) {
82 92
         KEY_INPUT;
@@ -122,18 +132,46 @@ static void game(void) {
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 158
         PosX += SpdX;
126 159
         PosY += SpdY;
127
-
128 160
         move_bkg(PosX >> 4, PosY >> 4);
129 161
 
162
+        uint8_t hiwater = SPR_NUM_START;
163
+
130 164
         // re-draw ship sprite when we've just rotated or are starting or stopping acceleration
131 165
         if ((acc & ACC_R) || ((prev_acc & (ACC_X | ACC_Y)) != (acc & (ACC_X | ACC_Y)))) {
132
-            uint8_t hiwater = SPR_NUM_START;
133 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 175
         prev_acc = acc;
138 176
 
139 177
         vsync();

+ 79
- 0
src/obj.c View File

@@ -0,0 +1,79 @@
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

@@ -0,0 +1,26 @@
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 +7,6 @@
7 7
 
8 8
 #include <gbdk/platform.h>
9 9
 #include <gbdk/metasprites.h>
10
-#include <stdint.h>
11 10
 
12 11
 #include "sprites.h"
13 12
 
@@ -87,7 +86,7 @@ void spr_init(void) {
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 90
     switch (flip) {
92 91
         case FLIP_Y:
93 92
             *hiwater += move_metasprite_flipy(
@@ -129,28 +128,28 @@ void spr_ship(enum SPRITE_ROT rot, uint8_t moving, uint8_t *hiwater) {
129 128
         case ROT_0:
130 129
             spr_draw(SPR_SHIP_0, hiwater, FLIP_NONE, 0, 0);
131 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 133
             break;
135 134
 
136 135
         case ROT_90:
137 136
             spr_draw(SPR_SHIP_90, hiwater, FLIP_NONE, 0, 0);
138 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 140
             break;
142 141
 
143 142
         case ROT_180:
144 143
             spr_draw(SPR_SHIP_0, hiwater, FLIP_Y, 0, 0);
145 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 147
             break;
149 148
 
150 149
         case ROT_270:
151 150
             spr_draw(SPR_SHIP_90, hiwater, FLIP_X, 0, 0);
152 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 154
             break;
156 155
 

+ 3
- 1
src/sprites.h View File

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

Loading…
Cancel
Save