From d3f3ec21e089df127cdcb0422e8095c2d0070344 Mon Sep 17 00:00:00 2001 From: Ulysse Cura Date: Sun, 26 Jul 2026 14:00:55 +0200 Subject: [PATCH] Added running animation for player. --- SDL3_Core | 2 +- assets/Makefile | 5 +- src/components/headers/player_system.h | 19 +++--- src/components/player_system.c | 80 ++++++++++++++++++-------- src/game.c | 4 +- 5 files changed, 74 insertions(+), 36 deletions(-) diff --git a/SDL3_Core b/SDL3_Core index b2eabff..8b37fc7 160000 --- a/SDL3_Core +++ b/SDL3_Core @@ -1 +1 @@ -Subproject commit b2eabff7b13618d6e7872e3e0867bfb7f07bf8a6 +Subproject commit 8b37fc78fa36748444054cac3c862e94de3565e9 diff --git a/assets/Makefile b/assets/Makefile index c54daf0..8eb069d 100644 --- a/assets/Makefile +++ b/assets/Makefile @@ -1,6 +1,7 @@ ASSETS := \ player_sheets/player_idle_sheet.png \ player_sheets/player_walk_sheet.png \ + player_sheets/player_run_sheet.png\ tileset/tileset.png ASSETS := $(addprefix $(ASSETS_DIR)/,$(ASSETS)) @@ -16,8 +17,8 @@ include $(ASSET_BUILDER_DIR)/Makefile setup_asset: @echo "Building $(notdir $(ASSET_OUTPUT))" -$(ASSET_OUTPUT): $(ASSET_BUILDER_OUTPUT) - $(Q)$^ $@ $(ASSETS) +$(ASSET_OUTPUT): $(ASSET_BUILDER_OUTPUT) $(ASSETS) + $(Q)$(ASSET_BUILDER_OUTPUT) $@ $(ASSETS) asset_end: $(ASSET_OUTPUT) @echo "Built target $(notdir $(ASSET_OUTPUT))" diff --git a/src/components/headers/player_system.h b/src/components/headers/player_system.h index 3ca9dba..acff8ac 100644 --- a/src/components/headers/player_system.h +++ b/src/components/headers/player_system.h @@ -6,18 +6,21 @@ #include "sprite_component.h" #include "animation_system.h" -#define PLAYER_DEFAULT_SPEED 80.0f // px / s +#define PLAYER_DEFAULT_WALK_SPEED 60.0f // px / s +#define PLAYER_DEFAULT_RUN_SPEED 100.0f // px / s #define PLAYER_DEFAULT_IDLE_ANIMATION_SPEED 500.0f // ms / frame #define PLAYER_DEFAULT_WALK_ANIMATION_SPEED 160.0f // ms / frame +#define PLAYER_DEFAULT_RUN_ANIMATION_SPEED 100.0f // ms / frame typedef enum player_state_t { - PLAYER_IDLE = 0x00, // 00000000 - PLAYER_RUNNING_UP = 0x01, // 00000001 - PLAYER_RUNNING_DOWN = 0x02, // 00000010 - PLAYER_RUNNING_LEFT = 0x04, // 00000100 - PLAYER_RUNNING_RIGHT = 0x08, // 00001000 - PLAYER_RUNNING = 0x0F, // 00001111 - PLAYER_DEATH = 0x80 // 10000000 + PLAYER_IDLE = 0x00, // 00000000 + PLAYER_MOVING_UP = 0x01, // 00000001 + PLAYER_MOVING_DOWN = 0x02, // 00000010 + PLAYER_MOVING_LEFT = 0x04, // 00000100 + PLAYER_MOVING_RIGHT = 0x08, // 00001000 + PLAYER_MOVING = 0x0F, // 00001111 + PLAYER_RUNNING = 0x10, // 00010000 + PLAYER_DEATH = 0x80 // 10000000 } player_state_t; typedef struct player_system_data_t { diff --git a/src/components/player_system.c b/src/components/player_system.c index f87bd02..49d0cec 100644 --- a/src/components/player_system.c +++ b/src/components/player_system.c @@ -23,16 +23,30 @@ static inline void player_system_get_inputs(player_system_data_t *system_data) { system_data->last_state = system_data->state; - system_data->state &= 0xF0; // 11110000 + system_data->state &= 0xE0; // 11100000 - system_data->state |= game.events.keys[KEY_UP] * PLAYER_RUNNING_UP; - system_data->state |= game.events.keys[KEY_DOWN] * PLAYER_RUNNING_DOWN; - system_data->state |= game.events.keys[KEY_LEFT] * PLAYER_RUNNING_LEFT; - system_data->state |= game.events.keys[KEY_RIGHT] * PLAYER_RUNNING_RIGHT; + system_data->state |= game.events.keys[KEY_UP] ? PLAYER_MOVING_UP : 0; + system_data->state |= game.events.keys[KEY_DOWN] ? PLAYER_MOVING_DOWN : 0; + system_data->state |= game.events.keys[KEY_LEFT] ? PLAYER_MOVING_LEFT : 0; + system_data->state |= game.events.keys[KEY_RIGHT] ? PLAYER_MOVING_RIGHT : 0; + system_data->state |= game.events.keys[KEY_MOD] ? PLAYER_RUNNING : 0; // Special cases - if(system_data->state & PLAYER_RUNNING_UP && system_data->state & PLAYER_RUNNING_DOWN) system_data->state &= 0xFC; // 11111100 - if(system_data->state & PLAYER_RUNNING_LEFT && system_data->state & PLAYER_RUNNING_RIGHT) system_data->state &= 0xF3; // 11110011 + if(system_data->state & PLAYER_MOVING_UP && system_data->state & PLAYER_MOVING_DOWN) + { + if(system_data->last_state & PLAYER_MOVING_UP) + system_data->state &= ~PLAYER_MOVING_DOWN; + else + system_data->state &= ~PLAYER_MOVING_UP; + } + + if(system_data->state & PLAYER_MOVING_LEFT && system_data->state & PLAYER_MOVING_RIGHT) + { + if(system_data->last_state & PLAYER_MOVING_LEFT) + system_data->state &= ~PLAYER_MOVING_RIGHT; + else + system_data->state &= ~PLAYER_MOVING_LEFT; + } } // Only for this file @@ -40,36 +54,54 @@ 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; - transform_component_data->velocity.x = - (float)((system_data->state & PLAYER_RUNNING_RIGHT) >> 3) - (float)((system_data->state & PLAYER_RUNNING_LEFT) >> 2); - transform_component_data->velocity.y = - (float)((system_data->state & PLAYER_RUNNING_DOWN) >> 1) - (float)(system_data->state & PLAYER_RUNNING_UP); - - if(f_is_not_zero(transform_component_data->velocity.x) && f_is_not_zero(transform_component_data->velocity.y)) + if((system_data->state & PLAYER_MOVING) != (system_data->last_state & PLAYER_MOVING)) { - transform_component_data->velocity.x *= 0.707106781186548f; - transform_component_data->velocity.y *= 0.707106781186548f; + transform_component_data->velocity.x = + (float)((system_data->state & PLAYER_MOVING_RIGHT) >> 3) - (float)((system_data->state & PLAYER_MOVING_LEFT) >> 2); + transform_component_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)) + { + transform_component_data->velocity.x *= 0.707106781186548f; + transform_component_data->velocity.y *= 0.707106781186548f; + } } } // Only for this file -static inline void player_system_set_animation(player_system_data_t *system_data) +static inline void player_system_set_animation_and_speed(player_system_data_t *system_data) { - sprite_component_data_t *sprite_component_data = system_data->sprite_component_data; 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; - if(system_data->state & PLAYER_RUNNING_LEFT) sprite_component_data->flip = true; - if(system_data->state & PLAYER_RUNNING_RIGHT) sprite_component_data->flip = false; + if(system_data->state & PLAYER_MOVING_LEFT) sprite_component_data->flip = true; + if(system_data->state & PLAYER_MOVING_RIGHT) sprite_component_data->flip = false; - if((system_data->state & PLAYER_RUNNING) && !(system_data->last_state & PLAYER_RUNNING)) + if(((system_data->state & PLAYER_MOVING) && !(system_data->last_state & PLAYER_MOVING)) + || ((system_data->state & PLAYER_MOVING) && (system_data->state & PLAYER_RUNNING) != (system_data->last_state & PLAYER_RUNNING))) { - animation_system_data->frame_delay_ms = PLAYER_DEFAULT_WALK_ANIMATION_SPEED; - animation_system_change_animation(animation_system_data, "player_walk_sheet", 4); + if(system_data->state & PLAYER_RUNNING) + { + transform_component_data->speed = PLAYER_DEFAULT_RUN_SPEED; + animation_system_data->frame_delay_ms = PLAYER_DEFAULT_RUN_ANIMATION_SPEED; + animation_system_data->actual_frame_nb = 0; + animation_system_change_animation(animation_system_data, "player_run_sheet", 8); + } + else + { + transform_component_data->speed = PLAYER_DEFAULT_WALK_SPEED; + animation_system_data->frame_delay_ms = PLAYER_DEFAULT_WALK_ANIMATION_SPEED; + animation_system_data->actual_frame_nb = 0; + animation_system_change_animation(animation_system_data, "player_walk_sheet", 4); + } } - else if(!(system_data->state & PLAYER_RUNNING) && (system_data->last_state & PLAYER_RUNNING)) + else if(!(system_data->state & PLAYER_MOVING) && (system_data->last_state & PLAYER_MOVING)) { animation_system_data->actual_frame_nb = 0; animation_system_data->frame_delay_ms = PLAYER_DEFAULT_IDLE_ANIMATION_SPEED; + animation_system_data->actual_frame_nb = 0; animation_system_change_animation(animation_system_data, "player_idle_sheet", 4); } } @@ -80,7 +112,7 @@ void player_system_update(component_t *component) player_system_get_inputs(system_data); player_system_set_velocity(system_data); - player_system_set_animation(system_data); + player_system_set_animation_and_speed(system_data); } void player_system_destroy(component_t *component) diff --git a/src/game.c b/src/game.c index 53a598a..83b4dba 100644 --- a/src/game.c +++ b/src/game.c @@ -23,9 +23,10 @@ int game_init(void) if(asset_manager_load_asset(&game.asset_manager, "player_idle_sheet", ASSET_TEXTURE)) return EXIT_FAILURE; if(asset_manager_load_asset(&game.asset_manager, "player_walk_sheet", ASSET_TEXTURE)) return EXIT_FAILURE; + if(asset_manager_load_asset(&game.asset_manager, "player_run_sheet", ASSET_TEXTURE)) return EXIT_FAILURE; component_t *component = create_component(TRANSFORM_COMPONENT); if(!component) return EXIT_FAILURE; - add_component(player, component, player_bounds, PLAYER_DEFAULT_SPEED); + add_component(player, component, player_bounds, PLAYER_DEFAULT_WALK_SPEED); component = create_component(SPRITE_COMPONENT); if(!component) return EXIT_FAILURE; add_component(player, component, "player_idle_sheet"); @@ -86,6 +87,7 @@ int game_exit(void) { if(asset_manager_let_go_asset(&game.asset_manager, "player_idle_sheet")) return EXIT_FAILURE; if(asset_manager_let_go_asset(&game.asset_manager, "player_walk_sheet")) return EXIT_FAILURE; + if(asset_manager_let_go_asset(&game.asset_manager, "player_run_sheet")) return EXIT_FAILURE; entity_manager_exit(&game.entity_manager); if(asset_manager_exit(&game.asset_manager)) return EXIT_FAILURE;