Browse Source

refactor main.c and start with black hole gravity implementation

Thomas B 2 months ago
parent
commit
bab9501d28
8 changed files with 368 additions and 186 deletions
  1. 223
    0
      src/game.c
  2. 44
    0
      src/game.h
  3. 38
    0
      src/input.c
  4. 29
    0
      src/input.h
  5. 4
    181
      src/main.c
  6. 28
    5
      src/obj.c
  7. 1
    0
      src/obj.h
  8. 1
    0
      src/sprites.h

+ 223
- 0
src/game.c View File

@@ -0,0 +1,223 @@
1
+/*
2
+ * game.c
3
+ * Duality
4
+ *
5
+ * Copyright (C) 2025 Thomas Buck <thomas@xythobuz.de>
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * See <http://www.gnu.org/licenses/>.
18
+ */
19
+
20
+#include <gbdk/platform.h>
21
+#include <gbdk/metasprites.h>
22
+#include <rand.h>
23
+#include <stdint.h>
24
+
25
+#include "maps.h"
26
+#include "obj.h"
27
+#include "sprites.h"
28
+#include "sound.h"
29
+#include "input.h"
30
+#include "game.h"
31
+
32
+enum ACCELERATION {
33
+    ACC_X = 1,
34
+    ACC_Y = 2,
35
+    ACC_R = 4,
36
+};
37
+
38
+#define BAR_OFFSET_X (4 - 80)
39
+#define HEALTH_OFFSET_Y -16
40
+#define POWER_OFFSET_Y 16
41
+
42
+static void status(uint8_t health, uint8_t power, uint8_t *hiwater) {
43
+    if (health > 0) {
44
+        switch (health >> 6) {
45
+            case 3:
46
+                spr_draw(SPR_HEALTH, FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 24, hiwater);
47
+            case 2:
48
+                spr_draw(SPR_HEALTH, FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 16, hiwater);
49
+            case 1:
50
+                spr_draw(SPR_HEALTH, FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 8, hiwater);
51
+            case 0:
52
+                spr_draw(SPR_HEALTH, FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 0, hiwater);
53
+        }
54
+    }
55
+
56
+    if (power > 0) {
57
+        switch (power >> 6) {
58
+            case 3:
59
+                spr_draw(SPR_POWER, FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 0, hiwater);
60
+            case 2:
61
+                spr_draw(SPR_POWER, FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 8, hiwater);
62
+            case 1:
63
+                spr_draw(SPR_POWER, FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 16, hiwater);
64
+            case 0:
65
+                spr_draw(SPR_POWER, FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 24, hiwater);
66
+        }
67
+    }
68
+}
69
+
70
+void game(void) {
71
+    disable_interrupts();
72
+    DISPLAY_OFF;
73
+    map_game();
74
+    SHOW_BKG;
75
+    SHOW_SPRITES;
76
+    SPRITES_8x8;
77
+    DISPLAY_ON;
78
+    enable_interrupts();
79
+
80
+    int16_t pos_x = 0;
81
+    int16_t pos_y = 0;
82
+    int16_t spd_x = 0;
83
+    int16_t spd_y = 0;
84
+    enum SPRITE_ROT rot = 0;
85
+    enum ACCELERATION prev_acc = 0xFF; // so we draw the ship on the first frame
86
+    uint8_t ship_hiwater = 0;
87
+    uint8_t health = HEALTH_MAX;
88
+    uint16_t power = POWER_MAX;
89
+
90
+    obj_init();
91
+
92
+    // TODO remove
93
+    obj_add(SPR_LIGHT, 64, 64, 0, 0);
94
+    //obj_add(SPR_DARK, -64, -64, 0, 0);
95
+    obj_add(SPR_DARK, -32, 0, 0, 0);
96
+    obj_add(SPR_SHOT_LIGHT, 32, 32, 0, 0);
97
+    obj_add(SPR_SHOT_DARK, -32, -32, 0, 0);
98
+
99
+    while(1) {
100
+        key_read();
101
+
102
+        enum ACCELERATION acc = 0;
103
+
104
+        if (key_pressed(J_LEFT)) {
105
+            rot = (rot - 1) & (ROT_INVALID - 1);
106
+            acc |= ACC_R;
107
+        } else if (key_pressed(J_RIGHT)) {
108
+            rot = (rot + 1) & (ROT_INVALID - 1);
109
+            acc |= ACC_R;
110
+        }
111
+
112
+        if (key_down(J_A) && (power > 0)) {
113
+            if (power >= POWER_DEC) {
114
+                power -= POWER_DEC;
115
+            } else {
116
+                power = 0;
117
+            }
118
+
119
+            switch (rot) {
120
+                case ROT_0:
121
+                    spd_y -= SPEED_INC;
122
+                    if (spd_y < -SPEED_MAX_ACC) spd_y = -SPEED_MAX_ACC;
123
+                    acc |= ACC_Y;
124
+                    break;
125
+
126
+                case ROT_90:
127
+                    spd_x += SPEED_INC;
128
+                    if (spd_x > SPEED_MAX_ACC) spd_x = SPEED_MAX_ACC;
129
+                    acc |= ACC_X;
130
+                    break;
131
+
132
+                case ROT_180:
133
+                    spd_y += SPEED_INC;
134
+                    if (spd_y > SPEED_MAX_ACC) spd_y = SPEED_MAX_ACC;
135
+                    acc |= ACC_Y;
136
+                    break;
137
+
138
+                case ROT_270:
139
+                    spd_x -= SPEED_INC;
140
+                    if (spd_x < -SPEED_MAX_ACC) spd_x = -SPEED_MAX_ACC;
141
+                    acc |= ACC_X;
142
+                    break;
143
+
144
+                default:
145
+                    break;
146
+            }
147
+        } else if (!key_down(J_A) && (power < POWER_MAX)) {
148
+            if (power <= (POWER_MAX - POWER_INC)) {
149
+                power += POWER_INC;
150
+            } else {
151
+                power = POWER_MAX;
152
+            }
153
+        }
154
+
155
+        // TODO
156
+        //obj_act(pos_x, pos_y, &spd_x, &spd_y);
157
+
158
+        // adjust speed down when not moving
159
+        if (!(acc & ACC_X)) {
160
+            if (spd_x != 0) {
161
+                if (spd_x > SPEED_MAX_IDLE) spd_x -= SPEED_DEC;
162
+                else if (spd_x < -SPEED_MAX_IDLE) spd_x += SPEED_DEC;
163
+            }
164
+        }
165
+        if (!(acc & ACC_Y)) {
166
+            if (spd_y != 0) {
167
+                if (spd_y > SPEED_MAX_IDLE) spd_y -= SPEED_DEC;
168
+                else if (spd_y < -SPEED_MAX_IDLE) spd_y += SPEED_DEC;
169
+            }
170
+        }
171
+
172
+        if (key_pressed(J_B)) {
173
+            int8_t ret = -1;
174
+            switch (rot) {
175
+                case ROT_0:
176
+                    ret = obj_add(SPR_SHOT, 0, -SHIP_OFF, spd_x, spd_y - SHOT_SPEED);
177
+                    break;
178
+
179
+                case ROT_90:
180
+                    ret = obj_add(SPR_SHOT, SHIP_OFF, 0, spd_x + SHOT_SPEED, spd_y);
181
+                    break;
182
+
183
+                case ROT_180:
184
+                    ret = obj_add(SPR_SHOT, 0, SHIP_OFF, spd_x, spd_y + SHOT_SPEED);
185
+                    break;
186
+
187
+                case ROT_270:
188
+                    ret = obj_add(SPR_SHOT, -SHIP_OFF, 0, spd_x - SHOT_SPEED, spd_y);
189
+                    break;
190
+
191
+                default:
192
+                    break;
193
+            }
194
+
195
+            if (ret == OBJ_ADDED) {
196
+                snd_noise();
197
+            }
198
+        }
199
+
200
+        pos_x += spd_x;
201
+        pos_y += spd_y;
202
+        move_bkg(pos_x >> POS_SCALE_BG, pos_y >> POS_SCALE_BG);
203
+
204
+        uint8_t hiwater = SPR_NUM_START;
205
+
206
+        // re-draw ship sprite when we've just rotated or are starting or stopping acceleration
207
+        if ((acc & ACC_R) || ((prev_acc & (ACC_X | ACC_Y)) != (acc & (ACC_X | ACC_Y)))) {
208
+            spr_ship(rot, acc & (ACC_X | ACC_Y), &hiwater);
209
+            ship_hiwater = hiwater;
210
+        } else {
211
+            hiwater = ship_hiwater;
212
+        }
213
+
214
+        obj_draw(spd_x, spd_y, &hiwater);
215
+        status(health, power >> POWER_SHIFT, &hiwater);
216
+
217
+        hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
218
+
219
+        prev_acc = acc;
220
+
221
+        vsync();
222
+    }
223
+}

+ 44
- 0
src/game.h View File

@@ -0,0 +1,44 @@
1
+/*
2
+ * game.h
3
+ * Duality
4
+ *
5
+ * Copyright (C) 2025 Thomas Buck <thomas@xythobuz.de>
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * See <http://www.gnu.org/licenses/>.
18
+ */
19
+
20
+#ifndef __GAME_H__
21
+#define __GAME_H__
22
+
23
+#define SPEED_INC 1
24
+#define SPEED_DEC 1
25
+
26
+#define SPEED_MAX_ACC 16
27
+#define SPEED_MAX_IDLE 12
28
+
29
+#define POS_SCALE_OBJS 5
30
+#define POS_SCALE_BG 6
31
+
32
+#define POWER_MAX 0x1FF
33
+#define POWER_SHIFT 1
34
+
35
+#define POWER_INC 2
36
+#define POWER_DEC 4
37
+
38
+#define HEALTH_MAX 0xFF
39
+
40
+#define SHOT_SPEED 23
41
+
42
+void game(void);
43
+
44
+#endif // __GAME_H__

+ 38
- 0
src/input.c View File

@@ -0,0 +1,38 @@
1
+/*
2
+ * input.c
3
+ * Duality
4
+ *
5
+ * Copyright (C) 2025 Thomas Buck <thomas@xythobuz.de>
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * See <http://www.gnu.org/licenses/>.
18
+ */
19
+
20
+#include <gbdk/platform.h>
21
+
22
+#include "input.h"
23
+
24
+static uint8_t joyp = 0;
25
+static uint8_t old_joyp = 0;
26
+
27
+void key_read(void) {
28
+    old_joyp = joyp;
29
+    joyp = joypad();
30
+}
31
+
32
+uint8_t key_down(uint8_t key) {
33
+    return joyp & key;
34
+}
35
+
36
+uint8_t key_pressed(uint8_t key) {
37
+    return (joyp ^ old_joyp) & joyp & key;
38
+}

+ 29
- 0
src/input.h View File

@@ -0,0 +1,29 @@
1
+/*
2
+ * input.h
3
+ * Duality
4
+ *
5
+ * Copyright (C) 2025 Thomas Buck <thomas@xythobuz.de>
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * See <http://www.gnu.org/licenses/>.
18
+ */
19
+
20
+#ifndef __INPUT_H__
21
+#define __INPUT_H__
22
+
23
+#include <stdint.h>
24
+
25
+void key_read(void);
26
+uint8_t key_down(uint8_t key);
27
+uint8_t key_pressed(uint8_t key);
28
+
29
+#endif // __INPUT_H__

+ 4
- 181
src/main.c View File

@@ -29,29 +29,8 @@
29 29
 #include "obj.h"
30 30
 #include "sprites.h"
31 31
 #include "sound.h"
32
-
33
-#define SPR_NUM_START 0
34
-
35
-static uint8_t joyp = 0;
36
-static uint8_t old_joyp = 0;
37
-
38
-#define KEY_INPUT (old_joyp = joyp, joyp = joypad())
39
-#define KEY_DOWN(KEY) (joyp & (KEY))
40
-#define KEY_PRESSED(KEY) ((joyp ^ old_joyp) & joyp & (KEY))
41
-
42
-enum ACCELERATION {
43
-    ACC_X = 1,
44
-    ACC_Y = 2,
45
-    ACC_R = 4,
46
-};
47
-
48
-#define SPEED_INC 1
49
-#define SPEED_MAX 16
50
-#define SHOT_SPEED 23
51
-
52
-#define BAR_OFFSET_X (4 - 80)
53
-#define HEALTH_OFFSET_Y -16
54
-#define POWER_OFFSET_Y 16
32
+#include "input.h"
33
+#include "game.h"
55 34
 
56 35
 static void splash(void) {
57 36
     disable_interrupts();
@@ -68,8 +47,8 @@ static void splash(void) {
68 47
     obj_add(SPR_DARK, -42, -42, 0, 0);
69 48
 
70 49
     while(1) {
71
-        KEY_INPUT;
72
-        if (KEY_DOWN(0xFF)) {
50
+        key_read();
51
+        if (key_down(0xFF)) {
73 52
             break;
74 53
         }
75 54
 
@@ -81,162 +60,6 @@ static void splash(void) {
81 60
     }
82 61
 }
83 62
 
84
-static void status(uint8_t health, uint8_t power, uint8_t *hiwater) {
85
-    if (health > 0) {
86
-        switch (health >> 6) {
87
-            case 3:
88
-                spr_draw(SPR_HEALTH, FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 24, hiwater);
89
-            case 2:
90
-                spr_draw(SPR_HEALTH, FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 16, hiwater);
91
-            case 1:
92
-                spr_draw(SPR_HEALTH, FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 8, hiwater);
93
-            case 0:
94
-                spr_draw(SPR_HEALTH, FLIP_X, BAR_OFFSET_X, HEALTH_OFFSET_Y - 0, hiwater);
95
-        }
96
-    }
97
-
98
-    if (power > 0) {
99
-        switch (power >> 6) {
100
-            case 3:
101
-                spr_draw(SPR_POWER, FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 0, hiwater);
102
-            case 2:
103
-                spr_draw(SPR_POWER, FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 8, hiwater);
104
-            case 1:
105
-                spr_draw(SPR_POWER, FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 16, hiwater);
106
-            case 0:
107
-                spr_draw(SPR_POWER, FLIP_X, BAR_OFFSET_X, POWER_OFFSET_Y + 24, hiwater);
108
-        }
109
-    }
110
-}
111
-
112
-static void game(void) {
113
-    disable_interrupts();
114
-    DISPLAY_OFF;
115
-    map_game();
116
-    SHOW_BKG;
117
-    SHOW_SPRITES;
118
-    SPRITES_8x8;
119
-    DISPLAY_ON;
120
-    enable_interrupts();
121
-
122
-    int16_t PosX = 0;
123
-    int16_t PosY = 0;
124
-    int16_t SpdX = 0;
125
-    int16_t SpdY = 0;
126
-    enum SPRITE_ROT rot = 0;
127
-    enum ACCELERATION prev_acc = 0xFF; // so we draw the ship on the first frame
128
-    uint8_t ship_hiwater = 0;
129
-    uint8_t health = 0xFF;
130
-    uint8_t power = 0xFF;
131
-
132
-    obj_init();
133
-
134
-    // TODO remove
135
-    obj_add(SPR_LIGHT, 64, 64, 0, 0);
136
-    obj_add(SPR_DARK, -64, -64, 0, 0);
137
-    obj_add(SPR_SHOT_LIGHT, 32, 32, 0, 0);
138
-    obj_add(SPR_SHOT_DARK, -32, -32, 0, 0);
139
-
140
-    while(1) {
141
-        KEY_INPUT;
142
-
143
-        enum ACCELERATION acc = 0;
144
-
145
-        if (KEY_PRESSED(J_LEFT)) {
146
-            rot = (rot - 1) & (ROT_INVALID - 1);
147
-            acc |= ACC_R;
148
-        } else if (KEY_PRESSED(J_RIGHT)) {
149
-            rot = (rot + 1) & (ROT_INVALID - 1);
150
-            acc |= ACC_R;
151
-        }
152
-
153
-        if (KEY_DOWN(J_A) && (power > 0)) {
154
-            power--;
155
-            switch (rot) {
156
-                case ROT_0:
157
-                    SpdY -= SPEED_INC;
158
-                    if (SpdY < -SPEED_MAX) SpdY = -SPEED_MAX;
159
-                    acc |= ACC_Y;
160
-                    break;
161
-
162
-                case ROT_90:
163
-                    SpdX += SPEED_INC;
164
-                    if (SpdX > SPEED_MAX) SpdX = SPEED_MAX;
165
-                    acc |= ACC_X;
166
-                    break;
167
-
168
-                case ROT_180:
169
-                    SpdY += SPEED_INC;
170
-                    if (SpdY > SPEED_MAX) SpdY = SPEED_MAX;
171
-                    acc |= ACC_Y;
172
-                    break;
173
-
174
-                case ROT_270:
175
-                    SpdX -= SPEED_INC;
176
-                    if (SpdX < -SPEED_MAX) SpdX = -SPEED_MAX;
177
-                    acc |= ACC_X;
178
-                    break;
179
-
180
-                default:
181
-                    break;
182
-            }
183
-        } else if (!KEY_DOWN(J_A) && (power < 0xFF)) {
184
-            power++;
185
-        }
186
-
187
-        if (KEY_PRESSED(J_B)) {
188
-            int8_t ret = -1;
189
-            switch (rot) {
190
-                case ROT_0:
191
-                    ret = obj_add(SPR_SHOT, 0, -SHIP_OFF, SpdX, SpdY - SHOT_SPEED);
192
-                break;
193
-
194
-                case ROT_90:
195
-                    ret = obj_add(SPR_SHOT, SHIP_OFF, 0, SpdX + SHOT_SPEED, SpdY);
196
-                break;
197
-
198
-                case ROT_180:
199
-                    ret = obj_add(SPR_SHOT, 0, SHIP_OFF, SpdX, SpdY + SHOT_SPEED);
200
-                break;
201
-
202
-                case ROT_270:
203
-                    ret = obj_add(SPR_SHOT, -SHIP_OFF, 0, SpdX - SHOT_SPEED, SpdY);
204
-                break;
205
-
206
-                default:
207
-                    break;
208
-            }
209
-
210
-            if (ret == OBJ_ADDED) {
211
-                snd_noise();
212
-            }
213
-        }
214
-
215
-        PosX += SpdX;
216
-        PosY += SpdY;
217
-        move_bkg(PosX >> 4, PosY >> 4);
218
-
219
-        uint8_t hiwater = SPR_NUM_START;
220
-
221
-        // re-draw ship sprite when we've just rotated or are starting or stopping acceleration
222
-        if ((acc & ACC_R) || ((prev_acc & (ACC_X | ACC_Y)) != (acc & (ACC_X | ACC_Y)))) {
223
-            spr_ship(rot, acc & (ACC_X | ACC_Y), &hiwater);
224
-            ship_hiwater = hiwater;
225
-        } else {
226
-            hiwater = ship_hiwater;
227
-        }
228
-
229
-        obj_draw(SpdX, SpdY, &hiwater);
230
-        status(health, power, &hiwater);
231
-
232
-        hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
233
-
234
-        prev_acc = acc;
235
-
236
-        vsync();
237
-    }
238
-}
239
-
240 63
 void main(void) {
241 64
     spr_init();
242 65
     snd_init();

+ 28
- 5
src/obj.c View File

@@ -21,8 +21,10 @@
21 21
 #include <string.h>
22 22
 #include <stdlib.h>
23 23
 
24
-#include "obj.h"
24
+#include "gb/hardware.h"
25 25
 #include "sprites.h"
26
+#include "game.h"
27
+#include "obj.h"
26 28
 
27 29
 /*
28 30
  * sprite budget:
@@ -104,8 +106,8 @@ enum OBJ_STATE obj_add(enum SPRITES sprite, int16_t off_x, int16_t off_y, int16_
104 106
 
105 107
     objs[obj_cnt].active = 1;
106 108
     objs[obj_cnt].sprite = sprite;
107
-    objs[obj_cnt].off_x = off_x << 4;
108
-    objs[obj_cnt].off_y = off_y << 4;
109
+    objs[obj_cnt].off_x = off_x << POS_SCALE_OBJS;
110
+    objs[obj_cnt].off_y = off_y << POS_SCALE_OBJS;
109 111
     objs[obj_cnt].spd_x = spd_x;
110 112
     objs[obj_cnt].spd_y = spd_y;
111 113
     objs[obj_cnt].travel = 0;
@@ -114,13 +116,32 @@ enum OBJ_STATE obj_add(enum SPRITES sprite, int16_t off_x, int16_t off_y, int16_
114 116
     return OBJ_ADDED;
115 117
 }
116 118
 
117
-void obj_draw(int16_t spd_x, int16_t spd_y, uint8_t *hiwater) {
119
+void obj_act(int16_t pos_x, int16_t pos_y, int16_t *spd_off_x, int16_t *spd_off_y) {
120
+    pos_x += DEVICE_SPRITE_PX_OFFSET_X + (DEVICE_SCREEN_PX_WIDTH / 2) - 16;
121
+    pos_y += DEVICE_SPRITE_PX_OFFSET_Y + (DEVICE_SCREEN_PX_HEIGHT / 2);
122
+
118 123
     for (uint8_t i = 0; i < MAX_OBJ; i++) {
119 124
         if (!objs[i].active) {
120 125
             continue;
121 126
         }
122 127
 
123
-        spr_draw(objs[i].sprite, FLIP_NONE, objs[i].off_x >> 4, objs[i].off_y >> 4, hiwater);
128
+        switch (objs[i].sprite) {
129
+            case SPR_DARK: {
130
+                *spd_off_x += (objs[i].off_x - pos_x) >> 8;
131
+                *spd_off_y += (objs[i].off_y - pos_y) >> 8;
132
+            } break;
133
+
134
+            default:
135
+                break;
136
+        }
137
+    }
138
+}
139
+
140
+void obj_draw(int16_t spd_x, int16_t spd_y, uint8_t *hiwater) {
141
+    for (uint8_t i = 0; i < MAX_OBJ; i++) {
142
+        if (!objs[i].active) {
143
+            continue;
144
+        }
124 145
 
125 146
         // move objects by their speed and compensate for movement of the background / ship
126 147
         objs[i].off_x += objs[i].spd_x - spd_x;
@@ -135,5 +156,7 @@ void obj_draw(int16_t spd_x, int16_t spd_y, uint8_t *hiwater) {
135 156
         if (objs[i].travel >= MAX_TRAVEL) {
136 157
             objs[i].active = 0;
137 158
         }
159
+
160
+        spr_draw(objs[i].sprite, FLIP_NONE, objs[i].off_x >> POS_SCALE_OBJS, objs[i].off_y >> POS_SCALE_OBJS, hiwater);
138 161
     }
139 162
 }

+ 1
- 0
src/obj.h View File

@@ -31,6 +31,7 @@ enum OBJ_STATE {
31 31
 
32 32
 void obj_init(void);
33 33
 enum OBJ_STATE obj_add(enum SPRITES sprite, int16_t off_x, int16_t off_y, int16_t spd_x, int16_t spd_y);
34
+void obj_act(int16_t pos_x, int16_t pos_y, int16_t *spd_off_x, int16_t *spd_off_y);
34 35
 void obj_draw(int16_t spd_x, int16_t spd_y, uint8_t *hiwater);
35 36
 
36 37
 #endif // __OBJ_H__

+ 1
- 0
src/sprites.h View File

@@ -22,6 +22,7 @@
22 22
 
23 23
 #include <stdint.h>
24 24
 
25
+#define SPR_NUM_START 0
25 26
 #define SHIP_OFF (8 + 4)
26 27
 
27 28
 enum SPRITES {

Loading…
Cancel
Save