diff options
| author | Aldrik Ramaekers <aldrik@amftech.nl> | 2023-12-25 11:38:41 +0100 |
|---|---|---|
| committer | Aldrik Ramaekers <aldrik@amftech.nl> | 2023-12-25 11:38:41 +0100 |
| commit | 655ad2a85235a215dbcdf1753bdcccaa2308b529 (patch) | |
| tree | cbe340289209eb338c0fb2ca2a303b69dafd2c79 /src | |
| parent | ca7d3a7bb8a98c6dd5c00a6dca84921948f71229 (diff) | |
area selection editor
Diffstat (limited to 'src')
| -rw-r--r-- | src/editor.c | 30 | ||||
| -rw-r--r-- | src/objects.c | 8 |
2 files changed, 33 insertions, 5 deletions
diff --git a/src/editor.c b/src/editor.c index 5a15870..5166cc1 100644 --- a/src/editor.c +++ b/src/editor.c @@ -255,21 +255,27 @@ typedef enum t_object_editor_state { OBJECT_EDITOR_PLACING, } object_editor_state; -object_editor_state object_edit_state = OBJECT_EDITOR_PLACING; +object_editor_state object_edit_state = OBJECT_EDITOR_SELECTING; object_type object_to_place = OBJECT_NONE; - +vec2 select_start = {0,0}; +vec2 select_end = {0,0}; +static bool is_selecting = false; void update_object_editor(platform_window* window) { map_info info = get_map_info(window); vec2 pos = screen_pos_to_world_pos(window, _global_mouse.x, _global_mouse.y); + if (keyboard_is_key_down(KEY_ESCAPE)) { + object_edit_state = OBJECT_EDITOR_SELECTING; + } + if (pos.x < 0 || pos.y < 0) return; if (pos.x >= loaded_map.width || pos.y >= loaded_map.height) return; switch (object_edit_state) { case OBJECT_EDITOR_PLACING: - if (is_left_down()) { + if (is_left_clicked()) { object obj = object_dict[object_to_place-1]; obj.position.x = pos.x; obj.position.y = pos.y; @@ -287,7 +293,16 @@ void update_object_editor(platform_window* window) { case OBJECT_EDITOR_SELECTING: if (is_left_clicked()) { - + select_start = pos; + select_end = pos; + is_selecting = true; + } + if (is_selecting && is_left_down()) { + select_end = pos; + } + if (is_selecting && is_left_released()) { + select_end = pos; + is_selecting = false; } break; @@ -315,6 +330,13 @@ void draw_object_panel(platform_window* window) { object_edit_state = OBJECT_EDITOR_PLACING; } } + + if (object_edit_state == OBJECT_EDITOR_SELECTING) + { + vec2f start = world_pos_to_screen_pos(window, select_start.x, select_start.y, 0); + vec2f end = world_pos_to_screen_pos(window, select_end.x - select_start.x, select_end.y - select_start.y, 0); + renderer->render_rectangle(start.x, start.y, end.x, end.y, rgba(255,0,0,100)); + } } diff --git a/src/objects.c b/src/objects.c index 2084b4d..2723fed 100644 --- a/src/objects.c +++ b/src/objects.c @@ -39,6 +39,12 @@ object get_object_at_tile(float x, float y) { } void add_object(object obj) { + object existing_obj = get_object_at_tile(obj.position.x, obj.position.y); + if (existing_obj.active) { + log_info("Space occupied, cannot place object."); + return; + } + for (int i = 0; i < MAX_OBJECTS; i++) { object o = map_to_load.objects[i]; if (o.active) continue; @@ -46,7 +52,7 @@ void add_object(object obj) { map_to_load.objects[i].active = true; return; } - log_info("OBJECT LIMIT REACHED!"); + log_info("Object limit reached."); } image* get_image_from_objecttype(object_type tile) { |
