diff options
Diffstat (limited to 'UI/Camera.gd')
-rw-r--r-- | UI/Camera.gd | 44 |
1 files changed, 37 insertions, 7 deletions
diff --git a/UI/Camera.gd b/UI/Camera.gd index 8f075cd..6c22d44 100644 --- a/UI/Camera.gd +++ b/UI/Camera.gd @@ -1,10 +1,11 @@ +class_name Camera extends Camera2D var is_in_drag_mode = false var drag_anchor = Vector2.ZERO -@export var speed = 5 +@export var speed = 25 @export_group("Zoom", "zoom") @export var zoom_min: float = 0.5 @@ -12,10 +13,27 @@ var drag_anchor = Vector2.ZERO @export var zoom_step: float = 0.01 +func _ready(): + get_viewport().size_changed.connect(func(): + set_new_position(global_position) + var new_zoom = Vector2( + get_rect().size.x / limit_right, + get_rect().size.y / limit_bottom + ) + zoom = Vector2( + new_zoom[new_zoom.max_axis_index()], + new_zoom[new_zoom.max_axis_index()] + ) + ) + + func _input(event): if event.is_action("camera_zoom_out"): - var min_zoom_min = limit_right / (get_viewport_rect().size.x / zoom.x) - if min_zoom_min >= 1.0: + var can_zoom_out = ( + limit_right / get_rect().end.x > 1.0 and + limit_bottom / get_rect().end.y > 1.0 + ) + if can_zoom_out: var new_zoom = max(zoom.x - zoom_step, zoom_min) zoom = Vector2(new_zoom, new_zoom) if event.is_action("camera_zoom_in"): @@ -29,7 +47,7 @@ func _input(event): is_in_drag_mode = false -func _process(_delta): +func _process(delta): if is_in_drag_mode: set_new_position(global_position + drag_anchor - get_global_mouse_position()) @@ -37,25 +55,37 @@ func _process(_delta): var direction_v = Input.get_axis("ui_up", "ui_down") if direction_h != 0 or direction_v != 0: - set_new_position(global_position + Vector2(direction_h * speed, direction_v * speed)) + set_new_position( + lerp( + global_position, + global_position + Vector2(direction_h * speed, direction_v * speed), + speed * delta + ) + ) func set_new_position(new_position: Vector2): new_position.x = clamp( new_position.x, limit_left, - limit_right - (get_viewport_rect().size.x / zoom.x) + limit_right - get_rect().size.x ) new_position.y = clamp( new_position.y, limit_top, - limit_bottom - (get_viewport_rect().size.y / zoom.y) + limit_bottom - get_rect().size.y ) global_position = new_position +func set_center(center_position: Vector2): + set_new_position( + center_position - (get_rect().size / 2) + ) + + func get_rect(): var viewport = get_viewport_rect() |