codename-routes/World/Tools/Camera/Camera.gd

54 lines
2.5 KiB
GDScript

extends Camera2D
export var zoom_strength = 0.6
export var zoom_limit_upper = 2
export var zoom_limit_lower = 0.05
signal limits_changed(lefttop, bottomright)
func _process(_delta: float) -> void:
# position
var left = Input.get_action_strength("move_camera_left")
var right = Input.get_action_strength("move_camera_right")
var x_direction = right - left
var up = Input.get_action_strength("move_camera_up")
var down = Input.get_action_strength("move_camera_down")
var y_direction = down - up
var direction = Vector2(x_direction, y_direction)
global_position += direction.normalized() * zoom.x * 3
#mouse drag
if Input.is_action_pressed("camera_drag"):
var distance = clamp(global_position.distance_to(get_global_mouse_position()) / 24, 0, 10)
global_position.x += global_position.direction_to(get_global_mouse_position()).x * distance
global_position.y += global_position.direction_to(get_global_mouse_position()).y * distance
# if camera goes out of bounds, then reset it
var halfwidth = ProjectSettings.get("display/window/size/width") / 2
var halfheight = ProjectSettings.get("display/window/size/height") / 2
if global_position.x - halfwidth * (zoom.x) <= limit_left :
global_position.x = limit_left + (halfwidth) * (zoom.x)
elif global_position.x + halfwidth * zoom.x >= limit_right:
global_position.x = limit_right - halfwidth * zoom.x
if global_position.y - halfheight * zoom.x <= limit_top:
global_position.y = limit_top + halfheight * zoom.x
elif global_position.y + halfheight * zoom.x >= limit_bottom:
global_position.y = limit_bottom - halfheight * zoom.x
# zoom
var zoom_direction = 0
if Input.is_action_just_released("camera_zoom_in") or Input.is_action_pressed("camera_zoom_in"):
zoom_direction = zoom_strength * -1
elif Input.is_action_just_released("camera_zoom_out") or Input.is_action_pressed("camera_zoom_out"):
zoom_direction = zoom_strength
if zoom_limit_lower <= (zoom.x + zoom_direction) && (zoom.x + zoom_direction) <= zoom_limit_upper:
zoom.x = lerp(zoom.x, zoom.x + zoom_direction, 0.1)
zoom.y = lerp(zoom.y, zoom.y + zoom_direction, 0.1)
func _on_Grid_size_updated(tiles: Array) -> void:
limit_left = tiles.front().global_position.x - 64
limit_top = tiles.front().global_position.y - 64
limit_bottom = tiles.back().global_position.y + 64
limit_right = tiles.back().global_position.x + 64
position.x = limit_right / 2.0
position.y = limit_bottom / 2.0
emit_signal("limits_changed", Vector2(limit_left, limit_top), Vector2(limit_right, limit_bottom))