Tim Strasser 2 лет назад
Родитель
Сommit
e38fdcf4d0
2 измененных файлов с 56 добавлено и 29 удалено
  1. 52 26
      includes/missile.c
  2. 4 3
      includes/missile.h

+ 52 - 26
includes/missile.c

@@ -9,36 +9,28 @@
 #include "missile.h"
 #include "barry.h"
 
-void missile_tick(MISSILE* const missiles, BARRY* const barry, State* const state) {
+void missile_tick(MISSILE* const missiles, BARRY* const barry, void (*death_handler)()) {
     // Move missiles towards the player
     for(int i = 0; i < MISSILES_MAX; i++) {
-        if(missile_colides(&missiles[i], barry)) {
-            // (*state) = GameStateGameOver;
-            UNUSED(state);
+        if(missiles[i].visible && missile_colides(&missiles[i], barry)) {
+            death_handler();
         }
-        if(missiles[i].point.x > 0) {
+        if(missiles[i].visible) {
             missiles[i].point.x -= 2; // move left by 2 units
-            if(missiles[i].point.x < -16) { // if the coin is out of screen
-                missiles[i].point.x = 0; // set coin x coordinate to 0 to mark it as "inactive"
+            if(missiles[i].point.x < -MISSILE_WIDTH) { // if the missile is out of screen
+                missiles[i].visible = false; // set missile as "inactive"
             }
         }
     }
 }
 
-bool missile_colides(MISSILE* const missile, BARRY* const barry) {
-    return !(
-        barry->point.x > missile->point.x + 26 || // Barry is to the right of the missile
-        barry->point.x + 11 < missile->point.x || // Barry is to the left of the missile
-        barry->point.y > missile->point.y + 12 || // Barry is below the missile
-        barry->point.y + 15 < missile->point.y); // Barry is above the missile
-}
-
 void spawn_random_missile(MISSILE* const missiles) {
-    // Check for an available slot for a new coin
+    // Check for an available slot for a new missile
     for(int i = 0; i < MISSILES_MAX; ++i) {
-        if(missiles[i].point.x <= 0) {
-            missiles[i].point.x = 127;
-            missiles[i].point.y = rand() % 64;
+        if(!missiles[i].visible) {
+            missiles[i].point.x = 2 * SCREEN_WIDTH;
+            missiles[i].point.y = rand() % (SCREEN_HEIGHT - MISSILE_HEIGHT);
+            missiles[i].visible = true;
             break;
         }
     }
@@ -46,14 +38,48 @@ void spawn_random_missile(MISSILE* const missiles) {
 
 void draw_missiles(const MISSILE* missiles, Canvas* const canvas, const GameSprites* sprites) {
     for(int i = 0; i < MISSILES_MAX; ++i) {
-        if(missiles[i].point.x > 0) {
+        if(missiles[i].visible) {
             canvas_set_color(canvas, ColorBlack);
-            canvas_draw_icon_animation(
-                canvas, missiles[i].point.x, missiles[i].point.y, sprites->missile);
 
-            canvas_set_color(canvas, ColorWhite);
-            canvas_draw_icon(
-                canvas, missiles[i].point.x, missiles[i].point.y, sprites->missile_infill);
+            if(missiles[i].point.x > 128) {
+                canvas_draw_icon_animation(
+                    canvas, SCREEN_WIDTH - 7, missiles[i].point.y, sprites->alert);
+            } else {
+                canvas_draw_icon_animation(
+                    canvas, missiles[i].point.x, missiles[i].point.y, sprites->missile);
+
+                canvas_set_color(canvas, ColorWhite);
+                canvas_draw_icon(
+                    canvas, missiles[i].point.x, missiles[i].point.y, sprites->missile_infill);
+            }
         }
     }
-}
+}
+
+bool missile_colides(MISSILE* const missile, BARRY* const barry) {
+    return !(
+        barry->point.x >
+            missile->point.x + MISSILE_WIDTH - 10 || // Barry is to the right of the missile
+        barry->point.x + BARRY_WIDTH < missile->point.x || // Barry is to the left of the missile
+        barry->point.y > missile->point.y + MISSILE_WIDTH || // Barry is below the missile
+        barry->point.y + BARRY_HEIGHT < missile->point.y); // Barry is above the missile
+}
+
+int get_rocket_spawn_distance(int player_distance) {
+    // Define the start and end points for rocket spawn distance
+    int start_distance = 256;
+    int end_distance = 32;
+
+    // Define the maximum player distance at which the spawn distance should be at its minimum
+    int max_player_distance = 5000; // Adjust this value based on your game's difficulty curve
+
+    if(player_distance >= max_player_distance) {
+        return end_distance;
+    }
+
+    // Calculate the linear interpolation factor
+    float t = (float)player_distance / max_player_distance;
+
+    // Interpolate the rocket spawn distance
+    return start_distance + t * (end_distance - start_distance);
+}

+ 4 - 3
includes/missile.h

@@ -8,16 +8,17 @@
 #include "point.h"
 #include "barry.h"
 
-#define MISSILES_MAX 2
+#define MISSILES_MAX 3
 
 typedef struct {
-    float gravity;
     POINT point;
+    bool visible;
 } MISSILE;
 
-void missile_tick(MISSILE* const missiles, BARRY* const barry, State* const state);
+void missile_tick(MISSILE* const missiles, BARRY* const barry, void (*death_handler)());
 void spawn_random_missile(MISSILE* const MISSILEs);
 bool missile_colides(MISSILE* const MISSILE, BARRY* const barry);
+int get_rocket_spawn_distance(int player_distance);
 void draw_missiles(const MISSILE* missiles, Canvas* const canvas, const GameSprites* sprites);
 
 #endif // MISSILE_H