add basic animation
buildbot/windows Build done.
buildbot/linux Build done.

This commit is contained in:
Sven Balzer
2026-08-02 12:40:24 +02:00
parent 70fac5bd72
commit f72ca9def5
6 changed files with 53 additions and 23 deletions
+29 -16
View File
@@ -188,6 +188,7 @@ static Uint16 indices[] = {
struct Instance {
vec2 pos;
uint32_t sprite_selection;
};
static Instance player_instance = {{ 0.0f, 0.0f }};
@@ -205,16 +206,6 @@ struct Map {
static Map current_map;
struct Player {
i32vec2 position;
i32vec2 target_position;
bool is_moving;
vec2 visual_position;
};
static Player player;
struct alignas(16) PerFrame {
i32vec2 drag_start;
i32vec2 mouse;
@@ -233,6 +224,19 @@ typedef enum : Uint8 {
DIR_RIGHT,
} Direction;
struct Player {
i32vec2 position;
i32vec2 target_position;
Direction direction;
bool is_moving;
vec2 visual_position;
Uint64 animation_time;
};
static Player player;
typedef enum : Uint8 {
TILEKIND_ERROR = 0,
TILEKIND_NONE = 1,
@@ -905,7 +909,7 @@ static bool init_resources() {
return false;
}
player_texture = create_texture("decorations/strawberry.png");
player_texture = create_texture("characters/Basic Charakter Spritesheet.png");
if (!player_texture) {
log_error("Failed to create shader texture.");
return false;
@@ -1434,6 +1438,8 @@ static void update_state_game() {
const bool *keyboard_state = SDL_GetKeyboardState(NULL);
if (player.is_moving) {
player.animation_time += delta_time;
vec2 leftover_movement = vec2(player.target_position) - player.visual_position;
vec2 movement = clamp(min(vec2(0, 0), leftover_movement), normalize(leftover_movement) * (delta_t * character_speed * (keyboard_state[SDL_SCANCODE_LSHIFT] ? 2.0f : 1.0f)), max(vec2(0, 0), leftover_movement));
player.visual_position += movement;
@@ -1446,14 +1452,17 @@ static void update_state_game() {
if (!player.is_moving && (queued_movement || keyboard_state[SDL_SCANCODE_W] || keyboard_state[SDL_SCANCODE_A] || keyboard_state[SDL_SCANCODE_S] || keyboard_state[SDL_SCANCODE_D])) {
switch (queued_movement_direction) {
case DIR_UP: { player.target_position = clamp(ivec2(0, 0), player.position + ivec2( 0, 1), current_map.size - ivec2(2, 2)); if (player.target_position != player.position) player.is_moving = true; } break;
case DIR_LEFT: { player.target_position = clamp(ivec2(0, 0), player.position + ivec2(-1, 0), current_map.size - ivec2(2, 2)); if (player.target_position != player.position) player.is_moving = true; } break;
case DIR_DOWN: { player.target_position = clamp(ivec2(0, 0), player.position + ivec2( 0, -1), current_map.size - ivec2(2, 2)); if (player.target_position != player.position) player.is_moving = true; } break;
case DIR_RIGHT: { player.target_position = clamp(ivec2(0, 0), player.position + ivec2( 1, 0), current_map.size - ivec2(2, 2)); if (player.target_position != player.position) player.is_moving = true; } break;
case DIR_UP: { player.direction = queued_movement_direction; player.target_position = clamp(ivec2(0, 0), player.position + ivec2( 0, 1), current_map.size - ivec2(2, 2)); if (player.target_position != player.position) player.is_moving = true; } break;
case DIR_LEFT: { player.direction = queued_movement_direction; player.target_position = clamp(ivec2(0, 0), player.position + ivec2(-1, 0), current_map.size - ivec2(2, 2)); if (player.target_position != player.position) player.is_moving = true; } break;
case DIR_DOWN: { player.direction = queued_movement_direction; player.target_position = clamp(ivec2(0, 0), player.position + ivec2( 0, -1), current_map.size - ivec2(2, 2)); if (player.target_position != player.position) player.is_moving = true; } break;
case DIR_RIGHT: { player.direction = queued_movement_direction; player.target_position = clamp(ivec2(0, 0), player.position + ivec2( 1, 0), current_map.size - ivec2(2, 2)); if (player.target_position != player.position) player.is_moving = true; } break;
}
}
queued_movement = false;
if (!player.is_moving)
player.animation_time = 0;
if (!MIX_TrackPlaying(music_track)) {
MIX_SetTrackAudio(music_track, music_setting_off_piano);
MIX_PlayTrack(music_track, 0);
@@ -1467,7 +1476,11 @@ static void render_game() {
ZoneScopedN("update buffers");
{
ZoneScopedN("player_instance_buffer");
player_instance.pos = player.visual_position;
Uint64 variation_index = (player.animation_time / (100 * SDL_NS_PER_MS)) % 4;
player_instance.pos = player.visual_position;
player_instance.sprite_selection = variation_index << 16 | player.direction;
renderer_buffer_update(player_instance_buffer, 0, sizeof(player_instance), &player_instance);
}