This commit is contained in:
+29
-16
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user