This commit is contained in:
+41
-7
@@ -201,6 +201,8 @@ struct Map {
|
|||||||
|
|
||||||
char name[64];
|
char name[64];
|
||||||
|
|
||||||
|
Uint8 *static_collision_grid;
|
||||||
|
|
||||||
R_Texture texture;
|
R_Texture texture;
|
||||||
R_Buffer placeables_buffer;
|
R_Buffer placeables_buffer;
|
||||||
};
|
};
|
||||||
@@ -465,6 +467,16 @@ static R_Texture create_texture(const char *path) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void recalculate_static_collision_grid(Map *world) {
|
||||||
|
if (world->static_collision_grid) SDL_free(world->static_collision_grid);
|
||||||
|
world->static_collision_grid = (Uint8 *)SDL_calloc((world->size.x - 2) * (world->size.y - 2), sizeof(*world->static_collision_grid));
|
||||||
|
|
||||||
|
for (int i = 0; i < world->num_placeables; i++) {
|
||||||
|
u32vec2 pos = world->placeables[i].pos;
|
||||||
|
world->static_collision_grid[pos.y * (world->size.x - 2) + pos.x] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static bool save_worlds_list() {
|
static bool save_worlds_list() {
|
||||||
const char *path = ASSETS_PATH "maps/worlds.h";
|
const char *path = ASSETS_PATH "maps/worlds.h";
|
||||||
|
|
||||||
@@ -680,6 +692,8 @@ static bool load_map(const char *name, Map *result) {
|
|||||||
result->placeables_buffer = renderer_buffer_create(R_BUFFER_USAGE_VERTEX, result->num_placeables * sizeof(*result->placeables), result->placeables, "placeables_buffer");
|
result->placeables_buffer = renderer_buffer_create(R_BUFFER_USAGE_VERTEX, result->num_placeables * sizeof(*result->placeables), result->placeables, "placeables_buffer");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
recalculate_static_collision_grid(result);
|
||||||
|
|
||||||
SDL_Log("Loaded map file.");
|
SDL_Log("Loaded map file.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1227,6 +1241,7 @@ static void process_event_editor(SDL_Event event) {
|
|||||||
|
|
||||||
if (current_map->placeables_buffer) renderer_buffer_destroy(current_map->placeables_buffer);
|
if (current_map->placeables_buffer) renderer_buffer_destroy(current_map->placeables_buffer);
|
||||||
current_map->placeables_buffer = renderer_buffer_create(R_BUFFER_USAGE_VERTEX, current_map->num_placeables * sizeof(*current_map->placeables), current_map->placeables, "placeables_buffer");
|
current_map->placeables_buffer = renderer_buffer_create(R_BUFFER_USAGE_VERTEX, current_map->num_placeables * sizeof(*current_map->placeables), current_map->placeables, "placeables_buffer");
|
||||||
|
recalculate_static_collision_grid(current_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (show_placeable_editor && selected_placeable == -1) {
|
if (show_placeable_editor && selected_placeable == -1) {
|
||||||
@@ -1240,6 +1255,7 @@ static void process_event_editor(SDL_Event event) {
|
|||||||
|
|
||||||
if (current_map->placeables_buffer) renderer_buffer_destroy(current_map->placeables_buffer);
|
if (current_map->placeables_buffer) renderer_buffer_destroy(current_map->placeables_buffer);
|
||||||
if (current_map->num_placeables) current_map->placeables_buffer = renderer_buffer_create(R_BUFFER_USAGE_VERTEX, current_map->num_placeables * sizeof(*current_map->placeables), current_map->placeables, "placeables_buffer");
|
if (current_map->num_placeables) current_map->placeables_buffer = renderer_buffer_create(R_BUFFER_USAGE_VERTEX, current_map->num_placeables * sizeof(*current_map->placeables), current_map->placeables, "placeables_buffer");
|
||||||
|
recalculate_static_collision_grid(current_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (selected_tile_kind != -1) {
|
if (selected_tile_kind != -1) {
|
||||||
@@ -1731,6 +1747,30 @@ static void render_editor() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool try_queued_move() {
|
||||||
|
queued_movement = false;
|
||||||
|
player.direction = queued_movement_direction;
|
||||||
|
|
||||||
|
i32vec2 target_position = player.position;
|
||||||
|
switch (queued_movement_direction) {
|
||||||
|
case DIR_UP: { target_position = clamp(ivec2(0, 0), player.position + ivec2( 0, 1), current_map->size - ivec2(2, 2)); } break;
|
||||||
|
case DIR_LEFT: { target_position = clamp(ivec2(0, 0), player.position + ivec2(-1, 0), current_map->size - ivec2(2, 2)); } break;
|
||||||
|
case DIR_DOWN: { target_position = clamp(ivec2(0, 0), player.position + ivec2( 0, -1), current_map->size - ivec2(2, 2)); } break;
|
||||||
|
case DIR_RIGHT: { target_position = clamp(ivec2(0, 0), player.position + ivec2( 1, 0), current_map->size - ivec2(2, 2)); } break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (target_position != player.position) {
|
||||||
|
if (current_map->static_collision_grid[target_position.y * (current_map->size.x - 2) + target_position.x] == 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
player.target_position = target_position;
|
||||||
|
player.is_moving = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static void process_event_game(SDL_Event event) {
|
static void process_event_game(SDL_Event event) {
|
||||||
ZoneScopedN("process_event");
|
ZoneScopedN("process_event");
|
||||||
|
|
||||||
@@ -1810,14 +1850,8 @@ static void update_state_game() {
|
|||||||
|
|
||||||
bool is_movement_key_pressed = keyboard_state[SDL_SCANCODE_W] || keyboard_state[SDL_SCANCODE_A] || keyboard_state[SDL_SCANCODE_S] || keyboard_state[SDL_SCANCODE_D] || keyboard_state[SDL_SCANCODE_UP] || keyboard_state[SDL_SCANCODE_LEFT] || keyboard_state[SDL_SCANCODE_DOWN] || keyboard_state[SDL_SCANCODE_RIGHT];
|
bool is_movement_key_pressed = keyboard_state[SDL_SCANCODE_W] || keyboard_state[SDL_SCANCODE_A] || keyboard_state[SDL_SCANCODE_S] || keyboard_state[SDL_SCANCODE_D] || keyboard_state[SDL_SCANCODE_UP] || keyboard_state[SDL_SCANCODE_LEFT] || keyboard_state[SDL_SCANCODE_DOWN] || keyboard_state[SDL_SCANCODE_RIGHT];
|
||||||
if (!player.is_moving && (queued_movement || is_movement_key_pressed)) {
|
if (!player.is_moving && (queued_movement || is_movement_key_pressed)) {
|
||||||
switch (queued_movement_direction) {
|
try_queued_move();
|
||||||
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)
|
if (!player.is_moving)
|
||||||
player.animation_time = 0;
|
player.animation_time = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user