From fded40cbd9747d4d7e1ea226bad98e6145fb094c Mon Sep 17 00:00:00 2001 From: swim67667 <150874399+Swim67667@users.noreply.github.com> Date: Sat, 27 Jun 2026 00:54:11 -0400 Subject: [PATCH] collision/more physics updates --- src/collision.c | 39 +++++++++++++++++++++++++-------------- src/entity.h | 1 + src/physics.c | 2 +- src/world.c | 14 ++++++++------ wrldboxMacOS | Bin 52336 -> 52336 bytes 5 files changed, 35 insertions(+), 21 deletions(-) diff --git a/src/collision.c b/src/collision.c index 14135c9..7e099c8 100644 --- a/src/collision.c +++ b/src/collision.c @@ -3,34 +3,42 @@ #include "config.h" #include "collision.h" #include "player.h" - +#include void checkCollision(){ for(int u=0; u<=MAX_ENTITIES-1; u++){ Entity *en1 = &entities[u]; if(!en1->active){ continue; } + en1->headgrounded = false; for(int j=u+1; j<=MAX_ENTITIES-1; j++){ if(u!=j){ Entity *en2 = &entities[j]; if(!en2->active){ continue; } - if (fabsf(en1->position.x - en2->position.x) < (en1->size * 0.5f + en2->size * 0.5f) && fabsf(en1->position.y - en2->position.y) < (en1->size * 0.5f + en2->size * 0.5f)) + printf("%d\n", en1->headgrounded); + + float half = (en1->size + en2->size) * 0.5f; + float overlapX = half - fabsf(en1->position.x - en2->position.x); + float overlapY = half - fabsf(en1->position.y - en2->position.y); + + if (overlapX > 0 && overlapY > 0) + { + if (overlapY < overlapX && en1->position.y < en2->position.y) { - - float forcex=fabsf(((en1->mass+en2->mass)/2)*((((en1->velocity.x)+(scale))+((en2->velocity.x)+(scale)))/2))*(scale); + // top collision + en1->position.y = en2->position.y - half; + en1->velocity.y = 0; + en1->velocity.x *= en2->drag; + en1->headgrounded = true; + } else { + en1->headgrounded = false; + float forcex=fabsf(((en1->mass+en2->mass)/2)*((((en1->velocity.x)+(scale))+((en2->velocity.x)+(scale)))/2))*(scale*1.5); float forcey=fabsf(((en1->mass+en2->mass)/2)*((((en1->velocity.y)+(scale))+((en2->velocity.y)+(scale)))/2))*(scale/4); - if(en1->position.y+en1->size*0.6f <= en2->position.y+en2->size*0.5f){ - ApplyForce( - en1, - (Vector2){0, -((en1->mass*g))} - ); - en1->velocity.y = en1->velocity.y * 0.1f; - en1->velocity.x = en1->velocity.x * en2->drag; - } - else if(en1->position.x < en2->position.x){ - + if(en1->position.x < en2->position.x){ + en1->velocity.x=0; + en2->velocity.x=0; ApplyForce( en1, (Vector2){-forcex, 0} @@ -41,6 +49,8 @@ void checkCollision(){ ); } else{ + en1->velocity.x=0; + en2->velocity.x=0; ApplyForce( en1, (Vector2){forcex, 0} @@ -50,6 +60,7 @@ void checkCollision(){ (Vector2){-forcex, 0} ); } + } } } } diff --git a/src/entity.h b/src/entity.h index 775a895..a1eeb62 100644 --- a/src/entity.h +++ b/src/entity.h @@ -10,6 +10,7 @@ typedef struct Entity bool isPlayer; bool affectedByGravity; + bool headgrounded; float mass; float size; diff --git a/src/physics.c b/src/physics.c index d6abc6d..a1f2dc4 100644 --- a/src/physics.c +++ b/src/physics.c @@ -21,7 +21,7 @@ void UpdateEntities(float dt, int screenWidth) bool onGround = IsGrounded(e); // Apply gravity force if enabled for this entity - if (e->affectedByGravity) + if (e->affectedByGravity && !onGround) { ApplyForce( e, diff --git a/src/world.c b/src/world.c index a283714..37d0f6f 100644 --- a/src/world.c +++ b/src/world.c @@ -1,5 +1,6 @@ #include #include "world.h" +#include "collision.h" // the beeg one. hooooooooooooooooh boy @@ -39,12 +40,12 @@ bool IsGrounded(Entity *e) { if (!e) return false; - - return ( - e->position.y + - e->size * 0.5f >= - ground_y - 2.0f - ); + if(e->position.y +e->size * 0.5f >=ground_y - 2.0f || e->headgrounded){ + return true; + } + else{ + return false; + } } Entity *SpawnEntity( @@ -76,6 +77,7 @@ Entity *SpawnEntity( e->force = (Vector2){0, 0}; e->color = color; + e->headgrounded = false; return e; } diff --git a/wrldboxMacOS b/wrldboxMacOS index aaee8234c98004e1aeb445a3d2c05068d8b207db..d0a1f3554693c5da87b178003a7066a097196bb4 100755 GIT binary patch delta 2611 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 x+7VcN*~+rlmhLS3_5AIlb6tkN9%@VNJ$|q1g`