From 32e6068f2ab306e1bd4c7b8d971b1ac38945337e Mon Sep 17 00:00:00 2001
From: Sara <sara@saragerretsen.nl>
Date: Wed, 25 Oct 2023 12:17:45 +0200
Subject: [PATCH] simplified player spawn function

---
 src/player.c | 52 ++++++++++++++++++++++++++--------------------------
 1 file changed, 26 insertions(+), 26 deletions(-)

diff --git a/src/player.c b/src/player.c
index ec25d7f..678e306 100644
--- a/src/player.c
+++ b/src/player.c
@@ -7,16 +7,18 @@
 #include "input.h"
 #include "physics_world.h"
 
-static Vector directional = ZeroVector;
+static Vector _directional = ZeroVector;
 static Spritesheet* spr_player_standing = NULL;
 
+static const int _ground_face = 7;
+
 static
 void player_input_h(int val) {
-    directional.x = val * 10.f;
+    _directional.x = val * 10.f;
 }
 static
 void player_input_v(int val) {
-    directional.y = -val * 10.f;
+    _directional.y = -val * 10.f;
 }
 
 void player_spawn(Player* self, Vector at) {
@@ -32,47 +34,45 @@ void player_start(Player* self) {
     input_add_axis_action(SDL_SCANCODE_A, SDL_SCANCODE_D, &player_input_h);
     input_add_axis_action(SDL_SCANCODE_S, SDL_SCANCODE_W, &player_input_v);
 
-    self->transform = IdentityTransform;
-    self->transform.scale = (Vector){4.f, 4.f};
-
     spr_player_standing = spritesheet_load("assets/sprites/player.png", (IVector){128, 128});
-    store_asset(self, free);
-
-    self->sprite = sprite_from_spritesheet(spr_player_standing, 0);
-    sprite_set_origin(self->sprite, (Vector){0.25f, 1.f});
-
-    self->rigidbody = rigidbody_make(Player_as_Transformable(self));
-    rigidbody_set_mass(self->rigidbody, 10.f);
-
     float ex_w = 0.1f;
     float h = .75f;
     float r = 0.05f;
     float rr = r;
-
-    self->shape = shape_new((Vector[]){
-        {r-ex_w, 0.f}, {-ex_w, -rr},
-        {-ex_w, rr-h}, {r-ex_w, -h},
-        {ex_w-r, -h}, {ex_w, rr-h},
-        {ex_w, -rr}, {ex_w-r, 0.f},
-    }, 8);
-
+    *self = (Player) {
+        .transform = {ZeroVector, {4, 4}, 0},
+        .sprite = sprite_from_spritesheet(spr_player_standing, 0),
+        .shape = shape_new((Vector[]){
+            {r-ex_w, 0.f}, {-ex_w, -rr},
+            {-ex_w, rr-h}, {r-ex_w, -h},
+            {ex_w-r, -h}, {ex_w, rr-h},
+            {ex_w, -rr}, {ex_w-r, 0.f},
+        }, 8)
+    };
+    self->rigidbody = rigidbody_make(Player_as_Transformable(self));
+    rigidbody_set_mass(self->rigidbody, 10.f);
     physics_world_add_entity(Player_as_PhysicsEntity(self));
+    sprite_set_origin(self->sprite, (Vector){0.25f, 1.f});
+    store_asset(self, free);
 }
 
 void player_update(Player* self, float dt) {
     Vector velocity = rigidbody_get_velocity(self->rigidbody);
-    Vector velocity_target = {directional.x, velocity.y};
-    if(directional.y < 0) {
-        directional.y = 0;
+    Vector velocity_target = {_directional.x, velocity.y};
+    if(_directional.y < 0 && self->is_grounded) {
+        _directional.y = 0;
         velocity.y = -20.f;
         rigidbody_set_velocity(self->rigidbody, velocity);
     }
     rigidbody_accelerate(self->rigidbody, vmulff(vsubf(velocity_target, velocity), 50.f), 0);
     rigidbody_accelerate(self->rigidbody, (Vector){0.0f, 100.f}, 0);
-
+    self->is_grounded = 0;
 }
 
 void player_collision(Player* self, Collision hit) {
+    if(hit.point.y > -0.01f) {
+        self->is_grounded = 1;
+    }
 }
 
 Sprite* player_get_sprite(Player* self) {