]> git.lizzy.rs Git - nothing.git/commitdiff
(#200) Make rigid rects float
authorrexim <reximkut@gmail.com>
Sun, 3 Jun 2018 18:28:40 +0000 (01:28 +0700)
committerrexim <reximkut@gmail.com>
Sun, 3 Jun 2018 18:28:40 +0000 (01:28 +0700)
levels/level-01.svg
levels/level-01.txt
src/game/level/lava.c
src/game/level/lava.h
src/game/level/lava/wavy_rect.c
src/game/level/lava/wavy_rect.h
src/game/level/player/rigid_rect.c

index d6bd718f5a3ce8216398e8bdff5e2253788a4124..740a11f3d3dd8d4492dbc6979a869bc947a59073 100644 (file)
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
      inkscape:zoom="0.24748737"
-     inkscape:cx="4815.7619"
-     inkscape:cy="2613.6522"
+     inkscape:cx="6339.0719"
+     inkscape:cy="2650.0177"
      inkscape:document-units="mm"
      inkscape:current-layer="svg4541"
      showgrid="false"
-     inkscape:window-width="956"
+     inkscape:window-width="1916"
      inkscape:window-height="1023"
      inkscape:window-x="0"
      inkscape:window-y="36"
      y="-581.78223"
      inkscape:label="#rect4617" />
   <rect
-     style="fill:#445016;fill-opacity:1;stroke:none;stroke-width:0.57905543"
+     style="fill:#445016;fill-opacity:1;stroke:none;stroke-width:0.5093438"
      id="box-1-3"
      width="25.34539"
-     height="75.592064"
-     x="1239.7523"
-     y="-478.45993"
+     height="58.486813"
+     x="1885.4755"
+     y="-525.49939"
      inkscape:label="#player-3" />
   <rect
      style="fill:#445016;fill-opacity:1;stroke:none;stroke-width:0.36330926"
index 3578ceb423aa180aa7d4d6862373e389eb749523..701f662eb69613d72f2e6e47b21384157c995c44 100644 (file)
@@ -28,6 +28,6 @@ fffda5
 5
 1111.9325 -526.31775 43.519718 43.519718 445016
 909.78552 -581.78223 71.628235 67.351921 445016
-1239.7523 -478.45993 25.34539 75.592064 445016
+1885.4755 -525.49939 25.34539 58.486813 445016
 1420.4265 -573.60791 26.414469 28.552624 445016
 1679.1434 -511.60135 43.519718 43.519718 445016
index d4c3dcb85f633ddfd10fb8dd78da79b2a83544c3..58f071a9256f9513b1f22169522e10ba538d7254 100644 (file)
@@ -5,6 +5,7 @@
 #include "color.h"
 #include "game/level/lava/wavy_rect.h"
 #include "lava.h"
+#include "math/rect.h"
 #include "system/error.h"
 #include "system/lt.h"
 
@@ -99,3 +100,15 @@ int lava_overlaps_rect(const lava_t *lava,
 
     return 0;
 }
+
+rect_t lava_overlap_area(const lava_t *lava,
+                         rect_t object)
+{
+    for (size_t i = 0; i < lava->rects_count; ++i) {
+        if (wavy_rect_overlaps(lava->rects[i], object)) {
+            return wavy_rect_overlap_area(lava->rects[i], object);
+        }
+    }
+
+    return rect(0.0f, 0.0f, 0.0f, 0.0f);
+}
index 27cfbeef7cec8c19eb4b673b57bb51b385e0390f..9149771f5ece4d3aeaa79ecccefa791b8e2f62cb 100644 (file)
@@ -16,4 +16,7 @@ int lava_update(lava_t *lava, float delta_time);
 int lava_overlaps_rect(const lava_t *lava,
                        rect_t rect);
 
+rect_t lava_overlap_area(const lava_t *lava,
+                         rect_t rect);
+
 #endif  // LAVA_H_
index 328bbc04c4351508d1ac2232996606612fe16859..7b6decd5cfe4ecb3d3d0ce334adcb6ab10b701b6 100644 (file)
@@ -109,3 +109,10 @@ int wavy_rect_overlaps(const wavy_rect_t *wavy_rect,
     assert(wavy_rect);
     return rects_overlap(wavy_rect->rect, rect);
 }
+
+rect_t wavy_rect_overlap_area(const wavy_rect_t *wavy_rect,
+                              rect_t rect)
+{
+    assert(wavy_rect);
+    return rects_overlap_area(wavy_rect->rect, rect);
+}
index cf2d7ca0cad088bfafb01745b6db93d1abc67619..8cd25a8b24e5a8699b23fe3105d3a2a516096c76 100644 (file)
@@ -20,5 +20,7 @@ int wavy_rect_update(wavy_rect_t *wavy_rect,
 
 int wavy_rect_overlaps(const wavy_rect_t *wavy_rect,
                        rect_t rect);
+rect_t wavy_rect_overlap_area(const wavy_rect_t *wavy_rect,
+                              rect_t rect);
 
 #endif  // WAVY_RECT_H_
index 8368872601e359dfe4f29b93181a9889329d7275..c3acab1109099dfcaadf18a526ea050fd3b915ea 100644 (file)
@@ -19,6 +19,7 @@ struct rigid_rect_t {
     vec_t size;
     color_t color;
     int touches_ground;
+    float floating;
 };
 
 static const vec_t opposing_rect_side_forces[RECT_SIDE_N] = {
@@ -67,6 +68,7 @@ rigid_rect_t *create_rigid_rect(rect_t rect, color_t color)
     rigid_rect->size = vec(rect.w, rect.h);
     rigid_rect->color = color;
     rigid_rect->touches_ground = 0;
+    rigid_rect->floating = 0.0f;
 
     return rigid_rect;
 }
@@ -128,7 +130,24 @@ int rigid_rect_update(rigid_rect_t * rigid_rect,
 
     rigid_rect->touches_ground = 0;
 
-    rigid_rect->velocity.y += RIGID_RECT_GRAVITY * delta_time;
+    if (rigid_rect->floating > 1e-6) {
+        rigid_rect->velocity = vec_sum(
+            rigid_rect->velocity,
+            vec_scala_mult(
+                vec_sum(
+                    vec(0.0f,  RIGID_RECT_GRAVITY),
+                    vec(0.0f, -RIGID_RECT_GRAVITY * 1.1f * rigid_rect->floating)),
+                delta_time));
+
+    } else {
+        rigid_rect->velocity = vec_sum(
+            rigid_rect->velocity,
+            vec_scala_mult(
+                vec(0.0f,  RIGID_RECT_GRAVITY),
+                delta_time));
+    }
+
+
     rigid_rect->position = vec_sum(
         rigid_rect->position,
         vec_scala_mult(
@@ -223,5 +242,6 @@ void rigid_rect_collide_with_lava(rigid_rect_t *rigid_rect,
     assert(rigid_rect);
     assert(lava);
 
-
+    rect_t overlap_area = lava_overlap_area(lava, rigid_rect_hitbox(rigid_rect));
+    rigid_rect->floating = (overlap_area.w * overlap_area.h) / (rigid_rect->size.x * rigid_rect->size.y);
 }