aboutsummaryrefslogtreecommitdiff
path: root/src/shapes.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/shapes.c')
-rw-r--r--src/shapes.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/shapes.c b/src/shapes.c
index 071fa63c..65e3621b 100644
--- a/src/shapes.c
+++ b/src/shapes.c
@@ -391,19 +391,28 @@ bool CheckCollisionCircles(Vector2 center1, float radius1, Vector2 center2, floa
}
// Check collision between circle and rectangle
+// NOTE: Reviewed version to take into account corner limit case
bool CheckCollisionCircleRec(Vector2 center, float radius, Rectangle rec)
{
- bool collision = false;
+ int recCenterX = rec.x + rec.width/2;
+ int recCenterY = rec.y + rec.height/2;
+
+ float dx = fabs(center.x - recCenterX);
+ float dy = fabs(center.y - recCenterY);
- float dx = fabs((rec.x + rec.width/2) - center.x);
- float dy = fabs((rec.y + rec.height/2) - center.y);
+ if (dx > (rec.width/2 + radius)) { return false; }
+ if (dy > (rec.height/2 + radius)) { return false; }
- if ((dx <= (rec.width/2 + radius)) && (dy <= (rec.height/2 + radius))) collision = true;
+ if (dx <= (rec.width/2)) { return true; }
+ if (dy <= (rec.height/2)) { return true; }
- return collision;
+ float cornerDistanceSq = pow(dx - rec.width/2, 2) + pow(dy - rec.height/2, 2);
+
+ return (cornerDistanceSq <= (radius*radius));
}
// Get collision rectangle for two rectangles collision
+// TODO: Depending on rec1 and rec2 order, it fails -> Review!
Rectangle GetCollisionRec(Rectangle rec1, Rectangle rec2)
{
Rectangle retRec = { 0, 0, 0, 0 };