]> git.lizzy.rs Git - nothing.git/commitdiff
Make back platforms always hide when player touches them
authorrexim <reximkut@gmail.com>
Sat, 25 Jan 2020 18:26:34 +0000 (01:26 +0700)
committerrexim <reximkut@gmail.com>
Sat, 25 Jan 2020 18:26:34 +0000 (01:26 +0700)
src/game/level.c
src/game/level/platforms.c
src/game/level/platforms.h

index eeb5b65478b93c2a4145b50a22b23eddec18bd23..c7c95c82b09872403212fe6d3964218963f20c66 100644 (file)
@@ -220,6 +220,10 @@ int level_update(Level *level, float delta_time)
     lava_update(level->lava, delta_time);
     labels_update(level->labels, delta_time);
 
+    Rect hitbox = player_hitbox(level->player);
+    platforms_hide_platform_at(level->back_platforms, vec(hitbox.x, hitbox.y));
+    platforms_update(level->back_platforms, delta_time);
+
     return 0;
 }
 
index 67b552ff874ecec977c6cfc81ef153acbaab5f82..08acf507f9355c8a11012388b71284fc4ebbe13a 100644 (file)
@@ -17,6 +17,7 @@ struct Platforms {
 
     Rect *rects;
     Color *colors;
+    int *hiding;
     size_t rects_size;
 };
 
@@ -50,6 +51,12 @@ Platforms *create_platforms_from_rect_layer(const RectLayer *layer)
     }
     memcpy(platforms->colors, rect_layer_colors(layer), sizeof(Color) * platforms->rects_size);
 
+    platforms->hiding = PUSH_LT(lt, nth_calloc(1, sizeof(int) * platforms->rects_size), free);
+    if (platforms->hiding == NULL) {
+        RETURN_LT(lt, NULL);
+    }
+    memset(platforms->hiding, 0, sizeof(int) * platforms->rects_size);
+
     return platforms;
 }
 
@@ -141,3 +148,32 @@ Vec2f platforms_snap_rect(const Platforms *platforms,
 
     return result;
 }
+
+#define HIDING_SPEED 2.0f
+
+void platforms_update(Platforms *platforms, float dt)
+{
+    trace_assert(platforms);
+    for (size_t i = 0; i < platforms->rects_size; ++i) {
+        if (platforms->hiding[i]) {
+            if (platforms->colors[i].a > 0.0f) {
+                platforms->colors[i].a =
+                    fmaxf(0.0f, platforms->colors[i].a - HIDING_SPEED * dt);
+            } else {
+                platforms->hiding[i] = 0;
+            }
+        }
+    }
+}
+
+void platforms_hide_platform_at(const Platforms *platforms,
+                                Vec2f position)
+{
+    trace_assert(platforms);
+
+    for (size_t i = 0; i < platforms->rects_size; ++i) {
+        if (rect_contains_point(platforms->rects[i], position)) {
+            platforms->hiding[i] = 1;
+        }
+    }
+}
index a3c8cb57b6d43436f4010daa571c7938bc66625b..35e84feac65534365bccbd991561a1f9f571df07 100644 (file)
@@ -15,10 +15,15 @@ void destroy_platforms(Platforms *platforms);
 int platforms_render(const Platforms *platforms,
                      const Camera *camera);
 
+void platforms_update(Platforms *platforms, float dt);
+
 void platforms_touches_rect_sides(const Platforms *platforms,
                                   Rect object,
                                   int sides[RECT_SIDE_N]);
 Vec2f platforms_snap_rect(const Platforms *platforms,
                           Rect *object);
 
+void platforms_hide_platform_at(const Platforms *platforms,
+                                Vec2f position);
+
 #endif  // PLATFORMS_H_