54 lines
2.5 KiB
GDScript
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))
|