player now has a constructor and implements drop

This commit is contained in:
Sara 2023-11-02 14:27:14 +01:00
parent 674d1b55fb
commit a6d50decc7
2 changed files with 37 additions and 12 deletions

View file

@ -6,6 +6,7 @@
#include "rigidbody.h"
#include "input.h"
#include "physics_world.h"
#include "game_world.h"
static Vector _directional = ZeroVector;
static Spritesheet* spr_player_standing = NULL;
@ -19,24 +20,17 @@ void player_input_v(int val) {
_directional.y = -val * 10.f;
}
void player_spawn(Player* self, Vector at) {
player_start(self);
rigidbody_get_transform(self->rigidbody)->position = at;
}
void player_collision_solver(Player* self, List* contacts) {
physics_entity_solve_contacts(Player_as_PhysicsEntity(self), contacts);
}
void player_start(Player* self) {
Player* player_new() {
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);
spr_player_standing = spritesheet_load("assets/sprites/player.png", (IVector){128, 128});
float ex_w = 0.1f;
float h = .75f;
float r = 0.05f;
float rr = 0.075f;
Player* self = malloc(sizeof(Player));
*self = (Player) {
.transform = {ZeroVector, {4, 4}, 0},
.sprite = sprite_from_spritesheet(spr_player_standing, 0),
@ -51,9 +45,20 @@ void player_start(Player* 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);
return self;
}
void player_spawn(Player* self, Vector at) {
rigidbody_get_transform(self->rigidbody)->position = at;
game_world_add_entity(Player_as_BehaviourEntity(self));
}
void player_collision_solver(Player* self, List* contacts) {
physics_entity_solve_contacts(Player_as_PhysicsEntity(self), contacts);
}
void player_start(Player* self) {}
void player_update(Player* self, float dt) {
Vector velocity = rigidbody_get_velocity(self->rigidbody);
Vector velocity_target = {self->is_grounded ? _directional.x : velocity.x, velocity.y};
@ -67,6 +72,17 @@ void player_update(Player* self, float dt) {
self->is_grounded = 0;
}
void player_draw(Player* self) {
sprite_entity_draw(Player_as_SpriteEntity(self));
}
void player_free(Player* self) {
rigidbody_destroy(self->rigidbody);
shape_destroy(self->shape);
sprite_destroy(self->sprite);
free(self);
}
void player_collision(Player* self, Collision hit) {
if(hit.point.y > -0.01f) {
self->is_grounded = 1;

View file

@ -1,6 +1,7 @@
#ifndef _fencer_player_h
#define _fencer_player_h
#include "drop.h"
#include "physics_entity.h"
#include "behaviour_entity.h"
#include "transformable.h"
@ -17,9 +18,12 @@ typedef struct Player {
int is_grounded;
} Player;
extern Player* player_new();
extern void player_spawn(Player* self, Vector at);
extern void player_start(Player* self);
extern void player_update(Player* self, float dt);
extern void player_draw(Player* self);
extern void player_free(Player* self);
extern void player_collision(Player* self, Collision hit);
@ -46,10 +50,15 @@ impl_PhysicsEntity_for(Player,
player_collision_solver
)
impl_Drop_for(Player,
player_free
)
impl_BehaviourEntity_for(Player,
player_start,
player_update,
player_spawn
player_spawn,
player_draw
)
#endif // !_fencer_player_h