141 lines
4.4 KiB
GDScript
141 lines
4.4 KiB
GDScript
extends Camera2D
|
|
|
|
# 相机移动速度
|
|
@export var move_speed: float = 400.0 # 每秒移动的像素数
|
|
@export var zoom_speed: float = 0.02 # 缩放速度
|
|
@export var min_zoom: float = 0.7 # 最小缩放值
|
|
@export var max_zoom: float = 1.2 # 最大缩放值
|
|
|
|
# 移动端触摸设置
|
|
@export var touch_sensitivity: float = 1.0 # 触摸灵敏度
|
|
@export var enable_touch_zoom: bool = true # 是否启用双指缩放
|
|
|
|
# 移动边界(可选)
|
|
@export var bounds_enabled: bool = false
|
|
@export var bounds_min: Vector2 = Vector2(-1000, -1000)
|
|
@export var bounds_max: Vector2 = Vector2(1000, 1000)
|
|
|
|
var current_zoom_level: float = 1.6
|
|
|
|
# 触摸相关变量
|
|
var is_dragging: bool = false
|
|
var last_touch_position: Vector2
|
|
var touch_points: Dictionary = {} # 存储多点触摸信息
|
|
var initial_zoom_distance: float = 0.0
|
|
|
|
func _ready():
|
|
# 初始化相机
|
|
zoom = Vector2(current_zoom_level, current_zoom_level)
|
|
|
|
|
|
|
|
func _process(delta):
|
|
if GlobalVariables.isZoomDisabled == true:
|
|
return
|
|
|
|
# 处理相机移动
|
|
var input_dir = Vector2.ZERO
|
|
|
|
# WASD 键移动
|
|
if Input.is_action_pressed("ui_up") or Input.is_key_pressed(KEY_W):
|
|
input_dir.y -= 1
|
|
if Input.is_action_pressed("ui_down") or Input.is_key_pressed(KEY_S):
|
|
input_dir.y += 1
|
|
if Input.is_action_pressed("ui_left") or Input.is_key_pressed(KEY_A):
|
|
input_dir.x -= 1
|
|
if Input.is_action_pressed("ui_right") or Input.is_key_pressed(KEY_D):
|
|
input_dir.x += 1
|
|
|
|
# 归一化移动向量,确保对角线移动不会更快
|
|
if input_dir.length() > 0:
|
|
input_dir = input_dir.normalized()
|
|
|
|
# 相机移动
|
|
position += input_dir * move_speed * delta / current_zoom_level
|
|
|
|
# 如果启用了边界限制,确保相机在边界内
|
|
if bounds_enabled:
|
|
position.x = clamp(position.x, bounds_min.x, bounds_max.x)
|
|
position.y = clamp(position.y, bounds_min.y, bounds_max.y)
|
|
|
|
# 处理相机缩放KEY_EQUAL
|
|
if Input.is_key_pressed(KEY_EQUAL) or Input.is_key_pressed(KEY_KP_ADD): # + 键放大
|
|
zoom_camera(-zoom_speed)
|
|
if Input.is_key_pressed(KEY_MINUS) or Input.is_key_pressed(KEY_KP_SUBTRACT): # - 键缩小
|
|
zoom_camera(zoom_speed)
|
|
|
|
# 处理输入事件(包括触摸和鼠标)
|
|
func _input(event):
|
|
if GlobalVariables.isZoomDisabled == true:
|
|
return
|
|
pass
|
|
|
|
# 鼠标滚轮缩放
|
|
if event is InputEventMouseButton:
|
|
if event.button_index == MOUSE_BUTTON_WHEEL_DOWN:
|
|
zoom_camera(-zoom_speed)
|
|
elif event.button_index == MOUSE_BUTTON_WHEEL_UP:
|
|
zoom_camera(zoom_speed)
|
|
|
|
# 触摸开始
|
|
elif event is InputEventScreenTouch:
|
|
if event.pressed:
|
|
# 记录触摸点
|
|
touch_points[event.index] = event.position
|
|
|
|
if len(touch_points) == 1:
|
|
# 单指触摸,开始拖动
|
|
is_dragging = true
|
|
last_touch_position = event.position
|
|
elif len(touch_points) == 2 and enable_touch_zoom:
|
|
# 双指触摸,准备缩放
|
|
is_dragging = false
|
|
var touches = touch_points.values()
|
|
initial_zoom_distance = touches[0].distance_to(touches[1])
|
|
else:
|
|
# 触摸结束
|
|
if touch_points.has(event.index):
|
|
touch_points.erase(event.index)
|
|
|
|
if len(touch_points) == 0:
|
|
is_dragging = false
|
|
elif len(touch_points) == 1:
|
|
# 从双指回到单指,重新开始拖动
|
|
is_dragging = true
|
|
last_touch_position = touch_points.values()[0]
|
|
|
|
# 触摸拖动
|
|
elif event is InputEventScreenDrag:
|
|
if touch_points.has(event.index):
|
|
touch_points[event.index] = event.position
|
|
|
|
if len(touch_points) == 1 and is_dragging:
|
|
# 单指拖动,移动相机
|
|
var drag_delta = last_touch_position - event.position
|
|
# 根据当前缩放级别调整移动距离
|
|
position += drag_delta * touch_sensitivity / current_zoom_level
|
|
|
|
# 应用边界限制
|
|
if bounds_enabled:
|
|
position.x = clamp(position.x, bounds_min.x, bounds_max.x)
|
|
position.y = clamp(position.y, bounds_min.y, bounds_max.y)
|
|
|
|
last_touch_position = event.position
|
|
|
|
elif len(touch_points) == 2 and enable_touch_zoom:
|
|
# 双指缩放
|
|
var touches = touch_points.values()
|
|
var current_distance = touches[0].distance_to(touches[1])
|
|
|
|
if initial_zoom_distance > 0:
|
|
var zoom_factor = current_distance / initial_zoom_distance
|
|
var zoom_change = (zoom_factor - 1.0) * zoom_speed * 10
|
|
zoom_camera(zoom_change)
|
|
|
|
initial_zoom_distance = current_distance
|
|
|
|
# 缩放相机
|
|
func zoom_camera(zoom_amount):
|
|
current_zoom_level = clamp(current_zoom_level + zoom_amount, min_zoom, max_zoom)
|
|
zoom = Vector2(current_zoom_level, current_zoom_level)
|