godot-plateformer/addons/reedcamera/scripts/camera_tools/CameraFollowController.gd

85 lines
2.1 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

extends CameraToolBasic
class_name ReedCameraFollowController
const _CONSTANTS := preload("res://addons/reedcamera/_data/CameraSystemConst.gd")
@export_group("Dead Zone")
@export var dead_zone_ratio := Rect2(
Vector2.ZERO, # 屏幕中心
Vector2(0.4, 0.4) # 宽高(屏幕比例)
)
@export_group("Follow")
@export var enabled_follow: bool = true
@export var follow_lerp := 0.12 # 0~1越大越“跟手”越小越“蔚蓝感”的滞后
var _follow_node2d : Node2D = null
var _desired_pos := Vector2.ZERO
var _camera: Camera2D = null
func _update_follow(delta: float) -> void:
if not enabled_follow:
return
if not _follow_node2d:
return
var cam := _get_camera_from_pointer()
if not cam:
return
# 初始化
if not _initialized:
_pos = cam.global_position
_desired_pos = _pos
_initialized = true
var view_rect := _get_camera_view_rect(cam)
var dead_rect := _get_dead_zone_world_rect(view_rect)
var p := player.global_position
var delta_move := Vector2.ZERO
if p.x < dead_rect.position.x:
delta_move.x = p.x - dead_rect.position.x
elif p.x > dead_rect.position.x + dead_rect.size.x:
delta_move.x = p.x - (dead_rect.position.x + dead_rect.size.x)
if p.y < dead_rect.position.y:
delta_move.y = p.y - dead_rect.position.y
elif p.y > dead_rect.position.y + dead_rect.size.y:
delta_move.y = p.y - (dead_rect.position.y + dead_rect.size.y)
if delta_move != Vector2.ZERO:
_desired_pos += delta_move
# 可选 room clamp
if use_room_clamp:
_desired_pos = _desired_pos.clamp(
room_world_rect.position,
room_world_rect.position + room_world_rect.size
)
# 蔚蓝感:滞后 lerp
_pos = _pos.lerp(_desired_pos, follow_lerp)
func _get_camera_from_pointer() -> Camera2D:
if _camera:
return _camera
var p := get_parent()
if p and p.has_method("get_camera"):
_camera = p.get_camera() as Camera2D
return _camera
return _camera
func _get_camera_view_rect(cam: Camera2D) -> Rect2:
var screen_size := cam.get_viewport_rect().size
var zoom := cam.zoom
zoom.x = maxf(zoom.x, 0.001)
zoom.y = maxf(zoom.y, 0.001)
var size := screen_size / zoom
return Rect2(cam.global_position - size * 0.5, size)