Browse Source

reorder main loop

Thomas B 1 month ago
parent
commit
2831e54995
3 changed files with 63 additions and 71 deletions
  1. 42
    35
      src/game.c
  2. 20
    34
      src/obj.c
  3. 1
    2
      src/obj.h

+ 42
- 35
src/game.c View File

40
 #define HEALTH_OFFSET_Y -16
40
 #define HEALTH_OFFSET_Y -16
41
 #define POWER_OFFSET_Y 16
41
 #define POWER_OFFSET_Y 16
42
 
42
 
43
+static uint8_t pause_screen(void) {
44
+    uint8_t hiwater = SPR_NUM_START;
45
+    spr_draw(SPR_PAUSE, FLIP_NONE, 0, 0, 0, &hiwater);
46
+    hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
47
+
48
+    while (1) {
49
+        key_read();
50
+        if (key_pressed(J_START)) {
51
+            break;
52
+        } else if (key_pressed(J_SELECT)) {
53
+            return 1;
54
+        }
55
+        vsync();
56
+    }
57
+
58
+    return 0;
59
+}
60
+
43
 static void status(uint8_t health, uint8_t power, uint8_t *hiwater) NONBANKED {
61
 static void status(uint8_t health, uint8_t power, uint8_t *hiwater) NONBANKED {
44
     if (health > 0) {
62
     if (health > 0) {
45
         switch (health >> 6) {
63
         switch (health >> 6) {
218
             }
236
             }
219
         }
237
         }
220
 
238
 
221
-        int32_t prev_score = score;
222
-        int16_t damage = obj_act(&spd_x, &spd_y, &score);
223
-        if (damage > 0) {
224
-            if (health > damage) {
225
-                health -= damage;
226
-            } else if (health <= damage) {
227
-                health = 0;
228
-                show_explosion(power);
229
-                break;
230
-            }
231
-        } else if (damage < 0) {
232
-            health += -damage;
233
-            if (health > HEALTH_MAX) {
234
-                health = HEALTH_MAX;
235
-            }
236
-        }
237
-
238
-        if (score != prev_score) {
239
-            uint8_t x_off = win_game_draw(score);
240
-            move_win(MINWNDPOSX + DEVICE_SCREEN_PX_WIDTH - x_off, MINWNDPOSY + DEVICE_SCREEN_PX_HEIGHT - 16);
241
-        }
242
-
243
         // adjust speed down when not moving
239
         // adjust speed down when not moving
244
         if (!(acc & ACC_X)) {
240
         if (!(acc & ACC_X)) {
245
             if (spd_x != 0) {
241
             if (spd_x != 0) {
302
         uint8_t redraw = (acc & ACC_R) || ((prev_acc & (ACC_X | ACC_Y)) != (acc & (ACC_X | ACC_Y)));
298
         uint8_t redraw = (acc & ACC_R) || ((prev_acc & (ACC_X | ACC_Y)) != (acc & (ACC_X | ACC_Y)));
303
 
299
 
304
         if (key_pressed(J_START)) {
300
         if (key_pressed(J_START)) {
305
-            uint8_t hiwater = SPR_NUM_START;
306
-            spr_draw(SPR_PAUSE, FLIP_NONE, 0, 0, 0, &hiwater);
307
-            hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
308
-
309
-            while (1) {
310
-                key_read();
311
-                if (key_pressed(J_START)) {
312
-                    break;
313
-                } else if (key_pressed(J_SELECT)) {
314
-                    return score;
315
-                }
316
-                vsync();
301
+            if (pause_screen()) {
302
+                break;
317
             }
303
             }
318
 
304
 
319
             // re-draw ship sprite
305
             // re-draw ship sprite
333
             hiwater = ship_hiwater;
319
             hiwater = ship_hiwater;
334
         }
320
         }
335
 
321
 
336
-        obj_draw(&hiwater);
322
+        int32_t prev_score = score;
323
+        int16_t damage = obj_do(&spd_x, &spd_y, &score, &hiwater);
324
+        if (damage > 0) {
325
+            if (health > damage) {
326
+                health -= damage;
327
+            } else if (health <= damage) {
328
+                health = 0;
329
+                show_explosion(power);
330
+                break;
331
+            }
332
+        } else if (damage < 0) {
333
+            health += -damage;
334
+            if (health > HEALTH_MAX) {
335
+                health = HEALTH_MAX;
336
+            }
337
+        }
338
+
337
         status(health >> HEALTH_SHIFT, power >> POWER_SHIFT, &hiwater);
339
         status(health >> HEALTH_SHIFT, power >> POWER_SHIFT, &hiwater);
338
 
340
 
339
         hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
341
         hide_sprites_range(hiwater, MAX_HARDWARE_SPRITES);
340
 
342
 
341
         prev_acc = acc;
343
         prev_acc = acc;
342
 
344
 
345
+        if (score != prev_score) {
346
+            uint8_t x_off = win_game_draw(score);
347
+            move_win(MINWNDPOSX + DEVICE_SCREEN_PX_WIDTH - x_off, MINWNDPOSY + DEVICE_SCREEN_PX_HEIGHT - 16);
348
+        }
349
+
343
         vsync();
350
         vsync();
344
     }
351
     }
345
 
352
 

+ 20
- 34
src/obj.c View File

28
 #include "obj.h"
28
 #include "obj.h"
29
 
29
 
30
 /*
30
 /*
31
- * sprite budget:
31
+ * sprite budget: TODO
32
  *
32
  *
33
  * fixed:
33
  * fixed:
34
- * ship: 4
35
- * thruster: 1
34
+ * ship: 4 + 5
35
+ * thruster: 1 - 1
36
  * health: 4
36
  * health: 4
37
  * power: 4
37
  * power: 4
38
- * --> 13 fixed
38
+ * --> 17 fixed
39
  *
39
  *
40
- * hardware tiles: 40 - 13 = 27
40
+ * hardware tiles: 40 - 13 = 27 - 4 = 23
41
  *
41
  *
42
  * dynamic:
42
  * dynamic:
43
  * shot: 1
43
  * shot: 1
84
     memset(objs, 0, sizeof(objs));
84
     memset(objs, 0, sizeof(objs));
85
 }
85
 }
86
 
86
 
87
-static uint8_t cnt_sprite(enum SPRITES sprite) NONBANKED {
88
-    uint8_t cnt = 0;
89
-    for (uint8_t i = 0; i < MAX_OBJ; i++) {
90
-        if (!objs[i].active) {
91
-            continue;
92
-        }
93
-        if (objs[i].sprite == sprite) {
94
-            cnt++;
95
-        }
96
-    }
97
-    return cnt;
98
-}
99
-
100
 enum OBJ_STATE obj_add(enum SPRITES sprite, int16_t off_x, int16_t off_y, int16_t spd_x, int16_t spd_y) NONBANKED {
87
 enum OBJ_STATE obj_add(enum SPRITES sprite, int16_t off_x, int16_t off_y, int16_t spd_x, int16_t spd_y) NONBANKED {
101
     uint8_t obj_cnt = 0xFF;
88
     uint8_t obj_cnt = 0xFF;
102
     for (uint8_t i = 0; i < MAX_OBJ; i++) {
89
     for (uint8_t i = 0; i < MAX_OBJ; i++) {
109
         return OBJ_LIST_FULL;
96
         return OBJ_LIST_FULL;
110
     }
97
     }
111
 
98
 
112
-    if (((sprite == SPR_DARK) && (cnt_sprite(sprite) >= MAX_DARK))
113
-            || ((sprite == SPR_LIGHT) && (cnt_sprite(sprite) >= MAX_LIGHT))
114
-            || ((sprite == SPR_SHOT) && (cnt_sprite(sprite) >= MAX_SHOT))
115
-            || ((sprite == SPR_SHOT_DARK) && (cnt_sprite(sprite) >= MAX_SHOT_DARK))
116
-            || ((sprite == SPR_SHOT_LIGHT) && (cnt_sprite(sprite) >= MAX_SHOT_LIGHT))) {
117
-        return OBJ_TYPE_FULL;
118
-    }
119
-
120
     objs[obj_cnt].active = 1;
99
     objs[obj_cnt].active = 1;
121
     objs[obj_cnt].sprite = sprite;
100
     objs[obj_cnt].sprite = sprite;
122
     objs[obj_cnt].off_x = off_x << POS_SCALE_OBJS;
101
     objs[obj_cnt].off_x = off_x << POS_SCALE_OBJS;
129
     return OBJ_ADDED;
108
     return OBJ_ADDED;
130
 }
109
 }
131
 
110
 
132
-int16_t obj_act(int16_t *spd_off_x, int16_t *spd_off_y, int32_t *score) NONBANKED {
111
+int16_t obj_do(int16_t *spd_off_x, int16_t *spd_off_y, int32_t *score, uint8_t *hiwater) NONBANKED {
133
     int16_t damage = 0;
112
     int16_t damage = 0;
113
+
114
+    // initial speed
134
     int16_t spd_x = *spd_off_x;
115
     int16_t spd_x = *spd_off_x;
135
     int16_t spd_y = *spd_off_y;
116
     int16_t spd_y = *spd_off_y;
136
 
117
 
154
             continue;
135
             continue;
155
         }
136
         }
156
 
137
 
157
-        // handle collission
138
+        int abs_off_x = abs(objs[i].off_x);
139
+        int abs_off_y = abs(objs[i].off_y);
140
+
141
+        // handle collision
158
         switch (objs[i].sprite) {
142
         switch (objs[i].sprite) {
159
             case SPR_DARK:
143
             case SPR_DARK:
160
-                if ((abs(objs[i].off_x) <= GRAVITY_RANGE) && (abs(objs[i].off_y) <= GRAVITY_RANGE)) {
144
+                if ((abs_off_x <= GRAVITY_RANGE) && (abs_off_y <= GRAVITY_RANGE)) {
161
                     if (objs[i].off_x > 0) {
145
                     if (objs[i].off_x > 0) {
162
                         *spd_off_x += (GRAVITY_RANGE - objs[i].off_x) >> GRAVITY_SHIFT;
146
                         *spd_off_x += (GRAVITY_RANGE - objs[i].off_x) >> GRAVITY_SHIFT;
163
                     } else if (objs[i].off_x < 0) {
147
                     } else if (objs[i].off_x < 0) {
170
                     }
154
                     }
171
                 }
155
                 }
172
 
156
 
173
-                if ((abs(objs[i].off_x) <= DAMAGE_RANGE) && (abs(objs[i].off_y) <= DAMAGE_RANGE)) {
157
+                if ((abs_off_x <= DAMAGE_RANGE) && (abs_off_y <= DAMAGE_RANGE)) {
174
                     damage += DAMAGE_INC;
158
                     damage += DAMAGE_INC;
175
                 }
159
                 }
176
                 break;
160
                 break;
177
 
161
 
178
             case SPR_LIGHT:
162
             case SPR_LIGHT:
179
-                if ((abs(objs[i].off_x) <= GRAVITY_RANGE) && (abs(objs[i].off_y) <= GRAVITY_RANGE)) {
163
+                if ((abs_off_x <= GRAVITY_RANGE) && (abs_off_y <= GRAVITY_RANGE)) {
180
                     if (objs[i].off_x > 0) {
164
                     if (objs[i].off_x > 0) {
181
                         *spd_off_x -= (GRAVITY_RANGE - objs[i].off_x) >> GRAVITY_SHIFT;
165
                         *spd_off_x -= (GRAVITY_RANGE - objs[i].off_x) >> GRAVITY_SHIFT;
182
                     } else if (objs[i].off_x < 0) {
166
                     } else if (objs[i].off_x < 0) {
189
                     }
173
                     }
190
                 }
174
                 }
191
 
175
 
192
-                if ((abs(objs[i].off_x) <= PICKUP_LARGE_RANGE) && (abs(objs[i].off_y) <= PICKUP_LARGE_RANGE)) {
176
+                if ((abs_off_x <= PICKUP_LARGE_RANGE) && (abs_off_y <= PICKUP_LARGE_RANGE)) {
193
                     damage -= HEALTH_MAX;
177
                     damage -= HEALTH_MAX;
194
                 }
178
                 }
195
                 break;
179
                 break;
196
 
180
 
197
             case SPR_SHOT_DARK:
181
             case SPR_SHOT_DARK:
198
-                if ((abs(objs[i].off_x) <= PICKUP_SMALL_RANGE) && (abs(objs[i].off_y) <= PICKUP_SMALL_RANGE)) {
182
+                if ((abs_off_x <= PICKUP_SMALL_RANGE) && (abs_off_y <= PICKUP_SMALL_RANGE)) {
199
                     (*score) -= SCORE_SMALL;
183
                     (*score) -= SCORE_SMALL;
200
                     objs[i].active = 0;
184
                     objs[i].active = 0;
201
                 }
185
                 }
202
                 break;
186
                 break;
203
 
187
 
204
             case SPR_SHOT_LIGHT:
188
             case SPR_SHOT_LIGHT:
205
-                if ((abs(objs[i].off_x) <= PICKUP_SMALL_RANGE) && (abs(objs[i].off_y) <= PICKUP_SMALL_RANGE)) {
189
+                if ((abs_off_x <= PICKUP_SMALL_RANGE) && (abs_off_y <= PICKUP_SMALL_RANGE)) {
206
                     (*score) += SCORE_SMALL;
190
                     (*score) += SCORE_SMALL;
207
                     objs[i].active = 0;
191
                     objs[i].active = 0;
208
                 }
192
                 }
233
             default:
217
             default:
234
                 break;
218
                 break;
235
         }
219
         }
220
+
221
+        spr_draw(objs[i].sprite, FLIP_NONE, objs[i].off_x >> POS_SCALE_OBJS, objs[i].off_y >> POS_SCALE_OBJS, 0, hiwater);
236
     }
222
     }
237
 
223
 
238
     return damage;
224
     return damage;

+ 1
- 2
src/obj.h View File

26
 enum OBJ_STATE {
26
 enum OBJ_STATE {
27
     OBJ_ADDED = 0,
27
     OBJ_ADDED = 0,
28
     OBJ_LIST_FULL,
28
     OBJ_LIST_FULL,
29
-    OBJ_TYPE_FULL,
30
 };
29
 };
31
 
30
 
32
 void obj_init(void);
31
 void obj_init(void);
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);
32
 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
-int16_t obj_act(int16_t *spd_off_x, int16_t *spd_off_y, int32_t *score);
33
+int16_t obj_do(int16_t *spd_off_x, int16_t *spd_off_y, int32_t *score, uint8_t *hiwater);
35
 void obj_draw(uint8_t *hiwater);
34
 void obj_draw(uint8_t *hiwater);
36
 
35
 
37
 #endif // __OBJ_H__
36
 #endif // __OBJ_H__

Loading…
Cancel
Save