47 lines
1.3 KiB
GDScript
47 lines
1.3 KiB
GDScript
extends Node
|
|
class_name IsometricCameraController
|
|
|
|
var camera : Camera2D
|
|
var initial_position : Vector2
|
|
var initial_zoom : Vector2
|
|
|
|
var drag_start = Vector2()
|
|
var drag_active = false
|
|
var zoom_min = 0.1
|
|
var zoom_max = 4.0
|
|
var zoom_speed = 0.1
|
|
|
|
func _init(camera_node):
|
|
camera = camera_node
|
|
initial_position = camera.position
|
|
initial_zoom = camera.zoom
|
|
|
|
func handle_input(event):
|
|
# Camera drag (pan) control
|
|
if event is InputEventMouseButton:
|
|
if event.button_index == MOUSE_BUTTON_RIGHT:
|
|
if event.pressed:
|
|
drag_start = event.position
|
|
drag_active = true
|
|
else:
|
|
drag_active = false
|
|
|
|
# Zoom control with mouse wheel
|
|
if event.button_index == MOUSE_BUTTON_WHEEL_DOWN:
|
|
zoom_camera(-zoom_speed)
|
|
elif event.button_index == MOUSE_BUTTON_WHEEL_UP:
|
|
zoom_camera(zoom_speed)
|
|
|
|
# Handle camera movement while dragging
|
|
if event is InputEventMouseMotion and drag_active:
|
|
camera.position -= event.relative / camera.zoom
|
|
|
|
func zoom_camera(zoom_amount):
|
|
var new_zoom = camera.zoom.x + zoom_amount
|
|
new_zoom = clamp(new_zoom, zoom_min, zoom_max)
|
|
camera.zoom = Vector2(new_zoom, new_zoom)
|
|
|
|
func reset_camera():
|
|
camera.position = initial_position
|
|
camera.zoom = initial_zoom
|