diff --git a/scene/ground/camera/camera_focus_marker.gd b/scene/ground/camera/camera_focus_marker.gd index ef06db3d..f7ba2a30 100644 --- a/scene/ground/camera/camera_focus_marker.gd +++ b/scene/ground/camera/camera_focus_marker.gd @@ -14,20 +14,47 @@ var _tweeked_position := Vector2.ZERO var zoom_tween: Tween var shake_ignore_boundary := false - +# default +var default_camera_rect := Rect2i(0, -158, 564, 316) func _ready() -> void: reset_speed() if not focusing_node: push_error("Focusing node not found") + +# 默认重置 limits +func apply_limits(rect := default_camera_rect, replace_default := true) -> void: + if replace_default: + default_camera_rect = rect + var start = rect.position + var end = rect.end + limit_left = start.x + limit_right = end.x + limit_top = start.y + limit_bottom = end.y + + func reset_speed() -> void: speed = 2.0 + func shake_camera(strength := 6.0, recovery_speed := 2.0, ignore_boundary := true): shake_strength = strength shake_recovery_speed = recovery_speed shake_ignore_boundary = ignore_boundary + if shake_ignore_boundary: + _update_limit_by_strength() + + +func _update_limit_by_strength() -> void: + var int_s := ceili(shake_strength) + var start = default_camera_rect.position + var end = default_camera_rect.end + limit_left = start.x - int_s + limit_right = end.x + int_s + limit_top = start.y - int_s + limit_bottom = end.y + int_s func reset_position_immediately(): @@ -69,7 +96,8 @@ func _physics_process(delta: float) -> void: global_position = progressing_position # handle shake - if shake_strength > 0.0: + if shake_strength > 0.01: #epsilon + _update_limit_by_strength() # 让 shake_strength 逐帧衰减 shake_recovery_speed = max(0.1, shake_recovery_speed) shake_strength = lerpf(shake_strength, 0.0, shake_recovery_speed * delta) @@ -87,6 +115,12 @@ func _physics_process(delta: float) -> void: global_position += shaked_offset if not shake_ignore_boundary: global_position = _clamp_boundary(global_position) + elif shake_ignore_boundary: + # reset limits + shake_ignore_boundary = false + shake_strength = 0.0 + _update_limit_by_strength() + # var taget_zoom = lerpf(zoom.x, zoom_ratio, speed * delta) # zoom = Vector2(taget_zoom, taget_zoom) diff --git a/scene/ground/ground.gd b/scene/ground/ground.gd index 049aeb12..03c6c255 100644 --- a/scene/ground/ground.gd +++ b/scene/ground/ground.gd @@ -194,13 +194,10 @@ func _calculate_player_rect() -> Rect2: return player_rect -func _apply_camera_limits(camera_rect: Rect2) -> void: +func _apply_camera_limits(camera_rect: Rect2i) -> void: var camera_marker = get_camera() if camera_marker: - camera_marker.limit_left = camera_rect.position.x - camera_marker.limit_right = camera_rect.position.x + camera_rect.size.x - camera_marker.limit_top = camera_rect.position.y - camera_marker.limit_bottom = camera_rect.position.y + camera_rect.size.y + camera_marker.apply_limits(camera_rect) func _apply_player_boundary(player_rect: Rect2) -> void: diff --git a/scene/ground/scene/c01/s11_黄包车演出.gd b/scene/ground/scene/c01/s11_黄包车演出.gd index 3f85d205..eb7c9d1e 100644 --- a/scene/ground/scene/c01/s11_黄包车演出.gd +++ b/scene/ground/scene/c01/s11_黄包车演出.gd @@ -31,7 +31,7 @@ func _on_ground_ready() -> void: camera.limit_bottom = 158 await SceneManager.ground_start # 相机抖动 - camera.shake_camera(6.0, 1.5) + camera.shake_camera(6.0, 2.5) # 不显示玩家,锁定玩家移动 SceneManager.lock_player() main_character = $"../DeployLayer/车夫与吕萍"