From 8eb07b489b03b71f37eb8caab2fbf57817c69c40 Mon Sep 17 00:00:00 2001 From: Ulysse Cura Date: Sun, 9 Aug 2026 14:11:16 +0200 Subject: [PATCH] Working interaction from player. --- SDL3_Core | 2 +- src/components/headers/interact_component.h | 1 + src/components/interact_component.c | 2 + src/components/player_system.c | 59 +++++++++++++++++---- 4 files changed, 54 insertions(+), 10 deletions(-) diff --git a/SDL3_Core b/SDL3_Core index a8aacc0..2179c7e 160000 --- a/SDL3_Core +++ b/SDL3_Core @@ -1 +1 @@ -Subproject commit a8aacc04ef2bff71e9ba340673216ea94454f3ea +Subproject commit 2179c7eb94e8c563d2a0dbe8b3e9048cf2e27512 diff --git a/src/components/headers/interact_component.h b/src/components/headers/interact_component.h index 9499dae..d3466f5 100644 --- a/src/components/headers/interact_component.h +++ b/src/components/headers/interact_component.h @@ -11,6 +11,7 @@ typedef struct interact_component_data_t { fvector2d_t position; fvector2d_t scale; frect_t bounds; + bool activated; } interact_component_data_t; int interact_component_init(component_t *component); diff --git a/src/components/interact_component.c b/src/components/interact_component.c index 6ccd3c9..8fe8bc5 100644 --- a/src/components/interact_component.c +++ b/src/components/interact_component.c @@ -26,6 +26,8 @@ inline int interact_component_init(component_t *component) .y = 1.0f }; + component_data->activated = true; + return EXIT_SUCCESS; } diff --git a/src/components/player_system.c b/src/components/player_system.c index 624f7fd..5985797 100644 --- a/src/components/player_system.c +++ b/src/components/player_system.c @@ -1,10 +1,12 @@ #include "player_system.h" #include "game.h" -#include "animation_system.h" #include "sprite_component.h" +#include "animation_system.h" +#include "interact_component.h" #include "physics_system.h" #include "memory_alloc.h" +#include "errors.h" inline int player_system_init(component_t *component) { @@ -44,7 +46,23 @@ inline int player_system_init(component_t *component) return EXIT_SUCCESS; } -// Only for this file +static void player_system_get_inputs(player_system_data_t *system_data); +static void player_system_set_velocity(player_system_data_t *system_data); +static int player_system_set_animation_and_speed(player_system_data_t *system_data); +static int player_system_process_interaction(player_system_data_t *system_data); + +inline int player_system_update(component_t *component) +{ + player_system_data_t *system_data = component->data; + + player_system_get_inputs(system_data); + player_system_set_velocity(system_data); + if(player_system_set_animation_and_speed(system_data)) return EXIT_FAILURE; + if(player_system_process_interaction(system_data)) return EXIT_FAILURE; + + return EXIT_SUCCESS; +} + static inline void player_system_get_inputs(player_system_data_t *system_data) { system_data->last_state = system_data->state; @@ -75,7 +93,6 @@ 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) { physics_system_data_t *physics_system_data = system_data->physics_system_data; @@ -95,7 +112,6 @@ static inline void player_system_set_velocity(player_system_data_t *system_data) } } -// Only for this file static inline int player_system_set_animation_and_speed(player_system_data_t *system_data) { animation_system_data_t *animation_system_data = system_data->animation_system_data; @@ -144,13 +160,38 @@ static inline int player_system_set_animation_and_speed(player_system_data_t *sy return EXIT_SUCCESS; } -inline int player_system_update(component_t *component) +// Args : player_system_data_t *system_data +static inline int action_detect_activate_interact(elem_t *elem, va_list args) { - player_system_data_t *system_data = component->data; + const entity_t *target_entity = elem->data; + const player_system_data_t *system_data = va_arg(args, player_system_data_t *); - player_system_get_inputs(system_data); - player_system_set_velocity(system_data); - if(player_system_set_animation_and_speed(system_data)) return EXIT_FAILURE; + const component_t *target_interact_component = entity_get_component(target_entity, INTERACT_COMPONENT); + if(!target_interact_component) return EXIT_SUCCESS; + + if(!((interact_component_data_t *)target_interact_component->data)->activated) + { + return EXIT_SUCCESS; + } + + const frect_t *hitbox_bounds = &system_data->physics_system_data->hitbox_component_data->bounds; + const frect_t *target_interact_bounds = &((interact_component_data_t *)target_interact_component->data)->bounds; + + if(fhas_intersection(hitbox_bounds, target_interact_bounds)) + { + static size_t i = 0; + debug_printf("Interact n*%lu", i++); + } + + return EXIT_SUCCESS; +} + +static inline int player_system_process_interaction(player_system_data_t *system_data) +{ + if(game.events.keys[KEY_INTERACT]) + { + if(linked_list_for_each(&game.entity_manager.entities, action_detect_activate_interact, system_data)) return EXIT_FAILURE; + } return EXIT_SUCCESS; }