diff --git a/src/Makefile b/src/Makefile index 88bde3f..41a50ff 100644 --- a/src/Makefile +++ b/src/Makefile @@ -3,6 +3,7 @@ SOURCES := \ game.c \ components/transform_component.c \ components/hitbox_component.c \ + components/physics_system.c \ components/sprite_component.c \ components/animation_system.c \ components/player_system.c diff --git a/src/components/headers/components.def b/src/components/headers/components.def index 02f2216..c692dce 100644 --- a/src/components/headers/components.def +++ b/src/components/headers/components.def @@ -10,6 +10,7 @@ COMPONENT(TRANSFORM_COMPONENT, transform_component, NO_DRAW) COMPONENT(HITBOX_COMPONENT, hitbox_component, NO_DRAW) #endif // DEBUG >= 2 +COMPONENT(PHYSICS_SYSTEM, physics_system, NO_DRAW) COMPONENT(SPRITE_COMPONENT, sprite_component, DRAW) COMPONENT(ANIMATION_SYSTEM, animation_system, NO_DRAW) COMPONENT(PLAYER_SYSTEM, player_system, NO_DRAW) diff --git a/src/components/headers/components.h b/src/components/headers/components.h index 4a2e062..e4215a8 100644 --- a/src/components/headers/components.h +++ b/src/components/headers/components.h @@ -3,6 +3,7 @@ #include "transform_component.h" #include "hitbox_component.h" +#include "physics_system.h" #include "sprite_component.h" #include "animation_system.h" #include "player_system.h" diff --git a/src/components/headers/physics_system.h b/src/components/headers/physics_system.h new file mode 100644 index 0000000..96d9744 --- /dev/null +++ b/src/components/headers/physics_system.h @@ -0,0 +1,20 @@ +#ifndef PHYSICS_SYSTEM_H +#define PHYSICS_SYSTEM_H + +#include "ecs.h" +#include "transform_component.h" +#include "vector2d.h" + +typedef struct physics_system_data_t { + transform_component_data_t *transform_component_data; + fvector2d_t velocity; + float speed; +} physics_system_data_t; + +int physics_system_init(component_t *component); + +int physics_system_update(component_t *component); + +int physics_system_destroy(component_t *component); + +#endif // PHYSICS_SYSTEM_H \ No newline at end of file diff --git a/src/components/headers/player_system.h b/src/components/headers/player_system.h index 7d15900..39f1234 100644 --- a/src/components/headers/player_system.h +++ b/src/components/headers/player_system.h @@ -2,7 +2,7 @@ #define PLAYER_SYSTEM_H #include "ecs.h" -#include "transform_component.h" +#include "physics_system.h" #include "sprite_component.h" #include "animation_system.h" @@ -24,7 +24,7 @@ typedef enum player_state_t { } player_state_t; typedef struct player_system_data_t { - transform_component_data_t *transform_component_data; + physics_system_data_t *physics_system_data; sprite_component_data_t *sprite_component_data; animation_system_data_t *animation_system_data; diff --git a/src/components/headers/transform_component.h b/src/components/headers/transform_component.h index f9c3c15..c9a2fb5 100644 --- a/src/components/headers/transform_component.h +++ b/src/components/headers/transform_component.h @@ -6,8 +6,6 @@ typedef struct transform_component_data_t { frect_t bounds; - fvector2d_t velocity; - float speed; } transform_component_data_t; int transform_component_init(component_t *component); diff --git a/src/components/physics_system.c b/src/components/physics_system.c new file mode 100644 index 0000000..9a5fe33 --- /dev/null +++ b/src/components/physics_system.c @@ -0,0 +1,42 @@ +#include "physics_system.h" + +#include "memory_alloc.h" +#include "game.h" + +// Args : frect_t bounds, double speed +int physics_system_init(component_t *component) +{ + physics_system_data_t *component_data = component->component_data; + + component_data->transform_component_data = entity_get_component(component->entity, TRANSFORM_COMPONENT)->component_data; + if(!component_data->transform_component_data) return EXIT_FAILURE; + + component_data->velocity = (fvector2d_t) { + .x = 0.0f, + .y = 0.0f + }; + + component_data->speed = 0.0f; + + return EXIT_SUCCESS; +} + +int physics_system_update(component_t *component) +{ + physics_system_data_t *component_data = component->component_data; + transform_component_data_t *transform_component_data = component_data->transform_component_data; + + transform_component_data->bounds.x += component_data->velocity.x * component_data->speed * (float)game.delta_time_ms / 1000.0f; + transform_component_data->bounds.y += component_data->velocity.y * component_data->speed * (float)game.delta_time_ms / 1000.0f; + + return EXIT_SUCCESS; +} + +inline int physics_system_destroy(component_t *component) +{ + physics_system_data_t *component_data = component->component_data; + + free(component_data); + + return EXIT_SUCCESS; +} diff --git a/src/components/player_system.c b/src/components/player_system.c index ca48619..48b89e7 100644 --- a/src/components/player_system.c +++ b/src/components/player_system.c @@ -4,7 +4,7 @@ #include "memory_alloc.h" #include "animation_system.h" #include "sprite_component.h" -#include "transform_component.h" +#include "physics_system.h" // No args inline int player_system_init(component_t *component) @@ -14,7 +14,8 @@ inline int player_system_init(component_t *component) system_data->animation_system_data = entity_get_component(component->entity, ANIMATION_SYSTEM)->component_data; if(!system_data->animation_system_data) return EXIT_FAILURE; system_data->sprite_component_data = system_data->animation_system_data->sprite_component_data; - system_data->transform_component_data = system_data->sprite_component_data->transform_component_data; + system_data->physics_system_data = entity_get_component(component->entity, PHYSICS_SYSTEM)->component_data; + if(!system_data->physics_system_data) return EXIT_FAILURE; system_data->state = PLAYER_MOVING; @@ -60,19 +61,19 @@ static inline void player_system_get_inputs(player_system_data_t *system_data) // Only for this file static inline void player_system_set_velocity(player_system_data_t *system_data) { - transform_component_data_t *transform_component_data = system_data->transform_component_data; + physics_system_data_t *physics_system_data = system_data->physics_system_data; if((system_data->state & PLAYER_MOVING) != (system_data->last_state & PLAYER_MOVING)) { - transform_component_data->velocity.x = + physics_system_data->velocity.x = (float)((system_data->state & PLAYER_MOVING_RIGHT) >> 3) - (float)((system_data->state & PLAYER_MOVING_LEFT) >> 2); - transform_component_data->velocity.y = + physics_system_data->velocity.y = (float)((system_data->state & PLAYER_MOVING_DOWN) >> 1) - (float)(system_data->state & PLAYER_MOVING_UP); - if(f_is_not_zero(transform_component_data->velocity.x) && f_is_not_zero(transform_component_data->velocity.y)) + if(f_is_not_zero(physics_system_data->velocity.x) && f_is_not_zero(physics_system_data->velocity.y)) { - transform_component_data->velocity.x *= 0.707106781186548f; - transform_component_data->velocity.y *= 0.707106781186548f; + physics_system_data->velocity.x *= 0.707106781186548f; + physics_system_data->velocity.y *= 0.707106781186548f; } } } @@ -82,7 +83,7 @@ static inline int player_system_set_animation_and_speed(player_system_data_t *sy { animation_system_data_t *animation_system_data = system_data->animation_system_data; sprite_component_data_t *sprite_component_data = system_data->sprite_component_data; - transform_component_data_t *transform_component_data = system_data->transform_component_data; + physics_system_data_t *physics_system_data = system_data->physics_system_data; if(system_data->state & PLAYER_MOVING_LEFT) sprite_component_data->flip = true; if(system_data->state & PLAYER_MOVING_RIGHT) sprite_component_data->flip = false; @@ -92,7 +93,7 @@ static inline int player_system_set_animation_and_speed(player_system_data_t *sy { if(system_data->state & PLAYER_RUNNING) { - transform_component_data->speed = PLAYER_DEFAULT_RUN_SPEED; + physics_system_data->speed = PLAYER_DEFAULT_RUN_SPEED; if(sprite_component_set_texture(sprite_component_data, "player_run_sheet")) return EXIT_FAILURE; @@ -103,7 +104,7 @@ static inline int player_system_set_animation_and_speed(player_system_data_t *sy } else { - transform_component_data->speed = PLAYER_DEFAULT_WALK_SPEED; + physics_system_data->speed = PLAYER_DEFAULT_WALK_SPEED; if(sprite_component_set_texture(sprite_component_data, "player_walk_sheet")) return EXIT_FAILURE; diff --git a/src/components/transform_component.c b/src/components/transform_component.c index 048c596..8c4b143 100644 --- a/src/components/transform_component.c +++ b/src/components/transform_component.c @@ -15,23 +15,11 @@ int transform_component_init(component_t *component) .h = 32.0f }; - component_data->velocity = (fvector2d_t) { - .x = 0.0f, - .y = 0.0f - }; - - component_data->speed = 0.0f; - return EXIT_SUCCESS; } inline int transform_component_update(component_t *component) { - transform_component_data_t *component_data = component->component_data; - - component_data->bounds.x += component_data->velocity.x * component_data->speed * (float)game.delta_time_ms / 1000.0f; - component_data->bounds.y += component_data->velocity.y * component_data->speed * (float)game.delta_time_ms / 1000.0f; - return EXIT_SUCCESS; } diff --git a/src/game.c b/src/game.c index 8873e13..fb9b53c 100644 --- a/src/game.c +++ b/src/game.c @@ -49,6 +49,7 @@ int game_init(void) .y = 0.5f }; + if(!entity_new_component(player, PHYSICS_SYSTEM)) return EXIT_FAILURE; if(!entity_new_component(player, SPRITE_COMPONENT)) return EXIT_FAILURE; if(!entity_new_component(player, ANIMATION_SYSTEM)) return EXIT_FAILURE; if(!entity_new_component(player, PLAYER_SYSTEM)) return EXIT_FAILURE;