]> git.lizzy.rs Git - nothing.git/commitdiff
Get rid of rigid_rect_collide_with_rect
authorrexim <reximkut@gmail.com>
Tue, 22 May 2018 06:18:47 +0000 (13:18 +0700)
committerrexim <reximkut@gmail.com>
Tue, 22 May 2018 06:18:47 +0000 (13:18 +0700)
src/game/level/boxes.c
src/game/level/player/rigid_rect.c
src/game/level/player/rigid_rect.h
src/game/level/solid.c
src/game/level/solid.h

index 5f62e9c1f270dcc8dfa0245c929a32fdda7d56ba..2a5f23841eb02a158db74fdf726e3357613a914d 100644 (file)
@@ -100,9 +100,9 @@ int boxes_update(boxes_t *boxes,
     for (size_t i = 0; i < boxes->count; ++i) {
         for (size_t j = 0; j < boxes->count; ++j) {
             if (i != j) {
-                rigid_rect_collide_with_rect(
+                rigid_rect_collide_with_solid(
                     boxes->bodies[i],
-                    rigid_rect_hitbox(boxes->bodies[j]));
+                    rigid_rect_as_solid(boxes->bodies[j]));
             }
         }
     }
index 4e93fc74dcfba34e2c926dd0dd6eb954b51baf22..ffdf1fad777150de029054c7eef15f1415dde9e2 100644 (file)
@@ -3,10 +3,11 @@
 #include <stdio.h>
 
 #include "color.h"
+#include "game/level/boxes.h"
+#include "game/level/solid.h"
 #include "rigid_rect.h"
 #include "system/error.h"
 #include "system/lt.h"
-#include "game/level/boxes.h"
 
 #define RIGID_RECT_GRAVITY 1500.0f
 
@@ -93,6 +94,24 @@ void destroy_rigid_rect(rigid_rect_t *rigid_rect)
     RETURN_LT0(rigid_rect->lt);
 }
 
+solid_ref_t rigid_rect_as_solid(rigid_rect_t *rigid_rect)
+{
+    const solid_ref_t ref = {
+        .tag = SOLID_RIGID_RECT,
+        .ptr = rigid_rect
+    };
+
+    return ref;
+}
+
+void rigid_body_object_collide(rigid_rect_t *rigid_rect,
+                               rect_t object,
+                               int sides[RECT_SIDE_N])
+{
+    const rect_t hitbox = rigid_rect_hitbox(rigid_rect);
+    rect_object_impact(&object, &hitbox, sides);
+}
+
 int rigid_rect_render(const rigid_rect_t *rigid_rect,
                       const camera_t *camera)
 {
@@ -125,6 +144,9 @@ int rigid_rect_update(rigid_rect_t * rigid_rect,
 void rigid_rect_collide_with_solid(rigid_rect_t * rigid_rect,
                                    solid_ref_t solid)
 {
+    assert(rigid_rect);
+    assert(rigid_rect != solid.ptr);
+
     int sides[RECT_SIDE_N] = { 0, 0, 0, 0 };
 
     solid_rect_object_collide(solid, rigid_rect_hitbox(rigid_rect), sides);
@@ -160,42 +182,6 @@ void rigid_rect_collide_with_solid(rigid_rect_t * rigid_rect,
     }
 }
 
-void rigid_rect_collide_with_rect(rigid_rect_t * rigid_rect,
-                                  rect_t rect)
-{
-    int sides[RECT_SIDE_N] = { 0, 0, 0, 0 };
-
-    const rect_t object = rect_from_vecs(rigid_rect->position, rigid_rect->size);
-    rect_object_impact(&object, &rect, sides);
-
-    if (sides[RECT_SIDE_BOTTOM]) {
-        rigid_rect->touches_ground = 1;
-    }
-
-    vec_t opposing_force = opposing_force_by_sides(sides);
-
-    for (int i = 0; i < 1000 && vec_length(opposing_force) > 1e-6; ++i) {
-        rigid_rect->position = vec_sum(
-            rigid_rect->position,
-            vec_scala_mult(
-                opposing_force,
-                1e-2f));
-
-        if (fabs(opposing_force.x) > 1e-6 && (opposing_force.x < 0.0f) != ((rigid_rect->velocity.x + rigid_rect->movement.x) < 0.0f)) {
-            rigid_rect->velocity.x = 0.0f;
-            rigid_rect->movement.x = 0.0f;
-        }
-
-        if (fabs(opposing_force.y) > 1e-6 && (opposing_force.y < 0.0f) != ((rigid_rect->velocity.y + rigid_rect->movement.y) < 0.0f)) {
-            rigid_rect->velocity.y = 0.0f;
-            rigid_rect->movement.y = 0.0f;
-        }
-
-        rect_object_impact(&object, &rect, sides);
-        opposing_force = opposing_force_by_sides(sides);
-    }
-}
-
 void rigid_rect_impact_rigid_rect(rigid_rect_t * rigid_rect,
                                  rigid_rect_t *another_rect)
 {
index e110bfd1a905a0f3ec1e8430ab0153eb2f1d2985..7528abda9d3c4fc4871fe4e1ddb61f09624fef53 100644 (file)
@@ -4,6 +4,7 @@
 #include "color.h"
 #include "game/camera.h"
 #include "game/level/platforms.h"
+#include "game/level/solid.h"
 #include "math/rect.h"
 
 typedef struct rigid_rect_t rigid_rect_t;
@@ -13,17 +14,20 @@ rigid_rect_t *create_rigid_rect(rect_t rect, color_t color);
 rigid_rect_t *create_rigid_rect_from_stream(FILE *stream);
 void destroy_rigid_rect(rigid_rect_t *rigid_rect);
 
+solid_ref_t rigid_rect_as_solid(rigid_rect_t *rigid_rect);
+
 int rigid_rect_render(const rigid_rect_t *rigid_rect,
                       const camera_t *camera);
 int rigid_rect_update(rigid_rect_t * rigid_rect,
                       float delta_time);
 
+void rigid_body_object_collide(rigid_rect_t *rigid_rect,
+                               rect_t object,
+                               int sides[RECT_SIDE_N]);
+
 void rigid_rect_collide_with_solid(rigid_rect_t * rigid_rect,
                                    solid_ref_t solid);
 
-// TODO: replace rigid_rect_collide_with_rect with rigid_rect_collide_with_solid
-void rigid_rect_collide_with_rect(rigid_rect_t * rigid_rect,
-                                  rect_t rect);
 void rigid_rect_impact_rigid_rect(rigid_rect_t * rigid_rect,
                                   rigid_rect_t *another_rect);
 
index 1c23bd3252ddc88485e22d2d1ae12ce552077748..d7c0e2bd713dba074d91953d608b9cf7f8f7e5ec 100644 (file)
@@ -1,6 +1,7 @@
-#include "./boxes.h"
-#include "./platforms.h"
-#include "./solid.h"
+#include "boxes.h"
+#include "platforms.h"
+#include "player/rigid_rect.h"
+#include "solid.h"
 
 void solid_rect_object_collide(solid_ref_t solid,
                                rect_t object,
@@ -15,6 +16,10 @@ void solid_rect_object_collide(solid_ref_t solid,
         boxes_rect_object_collide((boxes_t *) solid.ptr, object, sides);
         break;
 
+    case SOLID_RIGID_RECT:
+        rigid_body_object_collide((rigid_rect_t *) solid.ptr, object, sides);
+        break;
+
     default: {}
     }
 }
index b239f3f618fbc71ea9dcfefff0c1b953588052a1..64cc686875d3242c4d835ec7db3d5309569b122a 100644 (file)
@@ -5,7 +5,8 @@
 
 typedef enum solid_tag_t {
     SOLID_PLATFORMS = 0,
-    SOLID_BOXES
+    SOLID_BOXES,
+    SOLID_RIGID_RECT
 } solid_tag_t;
 
 typedef struct solid_ref_t {