84 lines
1.7 KiB
GDScript
84 lines
1.7 KiB
GDScript
extends Camera2D
|
|
|
|
@export_group("Zoom")
|
|
@export var _target_zoom: float = 1.0
|
|
|
|
|
|
func _ready() -> void:
|
|
position = Vector2(500, 500)
|
|
|
|
|
|
func _unhandled_input(event: InputEvent) -> void:
|
|
if event is InputEventMouseMotion:
|
|
if event.button_mask == MOUSE_BUTTON_MASK_MIDDLE:
|
|
position -= event.relative * zoom
|
|
|
|
if event is InputEventMouseButton:
|
|
if event.is_pressed():
|
|
if event.button_index == MOUSE_BUTTON_WHEEL_DOWN:
|
|
zoom_in()
|
|
if event.button_index == MOUSE_BUTTON_WHEEL_UP:
|
|
zoom_out()
|
|
|
|
if event is InputEventAction:
|
|
print("Action pressed", event.action)
|
|
if event.is_action_pressed("camera_up"):
|
|
move_up()
|
|
elif event.is_action_pressed("camera_down"):
|
|
move_down()
|
|
elif event.is_action_pressed("camera_left"):
|
|
move_left()
|
|
elif event.is_action_pressed("camera_right"):
|
|
move_right()
|
|
|
|
|
|
@export_group("Zoom")
|
|
@export var MIN_ZOOM: float = 0.1
|
|
@export var MAX_ZOOM: float = 1.0
|
|
@export var ZOOM_INCREMENT: float = 0.1
|
|
|
|
func zoom_in():
|
|
_target_zoom = max(_target_zoom - ZOOM_INCREMENT, MIN_ZOOM)
|
|
set_physics_process(true)
|
|
|
|
|
|
func zoom_out():
|
|
_target_zoom = min(_target_zoom + ZOOM_INCREMENT, MAX_ZOOM)
|
|
set_physics_process(true)
|
|
|
|
const ZOOM_RATE: float = 8.0
|
|
|
|
@export var camera_speed: float = 10
|
|
var target_position: Vector2
|
|
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
zoom = lerp(
|
|
zoom,
|
|
_target_zoom * Vector2.ONE,
|
|
ZOOM_RATE * delta
|
|
)
|
|
|
|
position = lerp(
|
|
position,
|
|
target_position,
|
|
camera_speed * delta
|
|
)
|
|
|
|
# set_physics_process(not is_equal_approx(zoom.x, _target_zoom))
|
|
|
|
|
|
func move_up():
|
|
target_position.y -= camera_speed
|
|
|
|
|
|
func move_down():
|
|
target_position.y += camera_speed
|
|
|
|
|
|
func move_right():
|
|
target_position.x += camera_speed
|
|
|
|
|
|
func move_left():
|
|
target_position.x -= camera_speed |