相机follow的配置更新

This commit is contained in:
RedisTKey 2026-01-13 22:42:41 +08:00
parent 54936007b9
commit 94bcf60a6d
13 changed files with 363 additions and 73 deletions

View File

@ -1,8 +1,8 @@
extends Node2D extends Node2D
func _ready() -> void: func _ready() -> void:
#$L0_S0.switch_act_by_id(1) $L0_S0.switch_act_by_id(1)
$L1_S1.switch_act_by_id(1) #$L1_S1.switch_act_by_id(1)
#$L1_S2.switch_act_by_id(1) #$L1_S2.switch_act_by_id(1)
#$L1_S3.switch_act_by_id(1) #$L1_S3.switch_act_by_id(1)
#$L1_S4.switch_act_by_id(1) #$L1_S4.switch_act_by_id(1)

View File

@ -0,0 +1,23 @@
extends SceneGuard
##如果为-1则不检查from_id只检查to id
@export var from_id: int = -1
##如果为-1不检查如果不为-1则如果act manager的act changed的to act是此id此guard通过。
@export var to_id: int = -1
func check(signal_args: Array) -> bool:
if to_id < 0:
return true
var has_from : bool = false
if from_id >= 0:
has_from = true
if has_from:
if signal_args[0] == from_id and signal_args[1] == to_id:
return true
else:
if signal_args[1] == to_id:
return true
return false

View File

@ -0,0 +1 @@
uid://dhs40v68rpfxr

View File

@ -0,0 +1,7 @@
[gd_resource type="Resource" load_steps=2 format=3 uid="uid://c7gm32jjs8wop"]
[ext_resource type="Script" uid="uid://dhs40v68rpfxr" path="res://_scene/guard/ActIDChanged/Guard_ActIDChangedCheck.gd" id="1_ae5sw"]
[resource]
script = ExtResource("1_ae5sw")
to_id = 1

View File

@ -1,15 +1,21 @@
[gd_scene load_steps=39 format=4 uid="uid://sursemsbf1lg"] [gd_scene load_steps=50 format=4 uid="uid://sursemsbf1lg"]
[ext_resource type="Script" uid="uid://5e157vdk6175" path="res://addons/reedscene/scene/ReedScene.gd" id="1_oyljl"] [ext_resource type="Script" uid="uid://5e157vdk6175" path="res://addons/reedscene/scene/ReedScene.gd" id="1_oyljl"]
[ext_resource type="Script" uid="uid://bh066o84byplh" path="res://addons/reedscene/scene/ReedSceneID.gd" id="2_ggwu1"] [ext_resource type="Script" uid="uid://bh066o84byplh" path="res://addons/reedscene/scene/ReedSceneID.gd" id="2_ggwu1"]
[ext_resource type="Script" uid="uid://dn0ksjoswquf5" path="res://addons/reedscene/scene/SceneManager.gd" id="3_7btev"] [ext_resource type="Script" uid="uid://dn0ksjoswquf5" path="res://addons/reedscene/scene/SceneManager.gd" id="3_7btev"]
[ext_resource type="Script" uid="uid://ons77en82uls" path="res://addons/reedscene/scene/scene_trigger/base/SceneTrigger.gd" id="4_pkqns"] [ext_resource type="Script" uid="uid://ons77en82uls" path="res://addons/reedscene/scene/scene_trigger/base/SceneTrigger.gd" id="4_pkqns"]
[ext_resource type="Resource" uid="uid://bym4pb0ellj7b" path="res://_scene/scene_trigger_resource/default_switch.tres" id="5_wiv8n"] [ext_resource type="Resource" uid="uid://bym4pb0ellj7b" path="res://_scene/scene_trigger_resource/default_switch.tres" id="5_wiv8n"]
[ext_resource type="Resource" uid="uid://c7gm32jjs8wop" path="res://_scene/guard/ActIDChanged/Guard_ActIDChangedCheck.tres" id="6_j5iwd"]
[ext_resource type="Script" uid="uid://dxj5vimigc651" path="res://addons/reedscene/scene/scene_trigger/base/SceneTriggerEffectPair.gd" id="7_0m4o0"]
[ext_resource type="Script" uid="uid://dsgl7lbyjsiif" path="res://addons/reedscene/act/ActManager.gd" id="7_mu7ca"] [ext_resource type="Script" uid="uid://dsgl7lbyjsiif" path="res://addons/reedscene/act/ActManager.gd" id="7_mu7ca"]
[ext_resource type="Script" uid="uid://fxpk2ot6otfh" path="res://addons/reedscene/act/Act.gd" id="8_0m4o0"] [ext_resource type="Script" uid="uid://fxpk2ot6otfh" path="res://addons/reedscene/act/Act.gd" id="8_0m4o0"]
[ext_resource type="Script" uid="uid://b1bgmb71bapws" path="res://addons/reedscene/scene/scene_trigger/base/SceneTriggerEffect.gd" id="8_1oohu"]
[ext_resource type="Script" uid="uid://baqgorvlumyju" path="res://addons/reedscene/act/SingleAct.gd" id="9_1oohu"] [ext_resource type="Script" uid="uid://baqgorvlumyju" path="res://addons/reedscene/act/SingleAct.gd" id="9_1oohu"]
[ext_resource type="Script" uid="uid://bjstkg23cq6vq" path="res://addons/reedscene/scene/scene_trigger/STE_SwitchAct.gd" id="9_g4f48"]
[ext_resource type="Script" uid="uid://pxjf5vst08eo" path="res://addons/reedscene/prop/PropManager.gd" id="10_g4f48"] [ext_resource type="Script" uid="uid://pxjf5vst08eo" path="res://addons/reedscene/prop/PropManager.gd" id="10_g4f48"]
[ext_resource type="Script" uid="uid://cwxwsfl1mx7kc" path="res://addons/reedscene/scene/scene_trigger/STT_Autoload.gd" id="10_o5yb1"]
[ext_resource type="PackedScene" uid="uid://bflwr7cryd2l0" path="res://_camera/CameraAnchor.tscn" id="11_o5yb1"] [ext_resource type="PackedScene" uid="uid://bflwr7cryd2l0" path="res://_camera/CameraAnchor.tscn" id="11_o5yb1"]
[ext_resource type="Script" uid="uid://cdprpen0jyr6d" path="res://addons/reedscene/scene/scene_trigger/STR_NodePath.gd" id="11_vhd7q"]
[ext_resource type="Script" uid="uid://b4menkyub4ce7" path="res://addons/reedscene/prop/PropComponent.gd" id="12_vhd7q"] [ext_resource type="Script" uid="uid://b4menkyub4ce7" path="res://addons/reedscene/prop/PropComponent.gd" id="12_vhd7q"]
[ext_resource type="Script" uid="uid://di41kt2tj34c2" path="res://addons/reedscene/prop/StateManager.gd" id="13_5fsuc"] [ext_resource type="Script" uid="uid://di41kt2tj34c2" path="res://addons/reedscene/prop/StateManager.gd" id="13_5fsuc"]
[ext_resource type="Script" uid="uid://7lml6d1t5xtq" path="res://addons/reedscene/prop/PropState.gd" id="14_rxcsc"] [ext_resource type="Script" uid="uid://7lml6d1t5xtq" path="res://addons/reedscene/prop/PropState.gd" id="14_rxcsc"]
@ -24,6 +30,35 @@
[ext_resource type="Script" uid="uid://8cqs3i8sr8b1" path="res://addons/reedscene/prop/Effect/ETT_Owner.gd" id="23_5h6d2"] [ext_resource type="Script" uid="uid://8cqs3i8sr8b1" path="res://addons/reedscene/prop/Effect/ETT_Owner.gd" id="23_5h6d2"]
[ext_resource type="TileSet" uid="uid://doepkfp83k0lb" path="res://_tileset/test.tres" id="24_uiy5k"] [ext_resource type="TileSet" uid="uid://doepkfp83k0lb" path="res://_tileset/test.tres" id="24_uiy5k"]
[sub_resource type="Resource" id="Resource_5fsuc"]
script = ExtResource("9_g4f48")
func_name = &"player_follow_camera"
metadata/_custom_type_script = "uid://bjstkg23cq6vq"
[sub_resource type="Resource" id="Resource_rxcsc"]
script = ExtResource("10_o5yb1")
autoload_name = &"GlobalEvent"
metadata/_custom_type_script = "uid://cwxwsfl1mx7kc"
[sub_resource type="Resource" id="Resource_xtmay"]
script = ExtResource("7_0m4o0")
target = SubResource("Resource_rxcsc")
effect = Array[ExtResource("8_1oohu")]([SubResource("Resource_5fsuc")])
metadata/_custom_type_script = "uid://dxj5vimigc651"
[sub_resource type="Resource" id="Resource_vjg7j"]
script = ExtResource("11_vhd7q")
node_path = NodePath("../ActManager")
monitor_signal = &"act_changed"
metadata/_custom_type_script = "uid://cdprpen0jyr6d"
[sub_resource type="Resource" id="Resource_j2lfw"]
script = ExtResource("4_pkqns")
trigger_register_conifg = SubResource("Resource_vjg7j")
guard = ExtResource("6_j5iwd")
trigger_effect_pairs = Array[ExtResource("7_0m4o0")]([SubResource("Resource_xtmay")])
metadata/_custom_type_script = "uid://ons77en82uls"
[sub_resource type="Resource" id="Resource_hd3du"] [sub_resource type="Resource" id="Resource_hd3du"]
script = ExtResource("9_1oohu") script = ExtResource("9_1oohu")
@ -104,7 +139,7 @@ script = ExtResource("2_ggwu1")
[node name="SceneManager" type="Node" parent="."] [node name="SceneManager" type="Node" parent="."]
script = ExtResource("3_7btev") script = ExtResource("3_7btev")
quick_trigger = Array[ExtResource("4_pkqns")]([ExtResource("5_wiv8n")]) quick_trigger = Array[ExtResource("4_pkqns")]([ExtResource("5_wiv8n"), SubResource("Resource_j2lfw")])
[node name="ActManager" type="Node" parent="."] [node name="ActManager" type="Node" parent="."]
script = ExtResource("7_mu7ca") script = ExtResource("7_mu7ca")

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,5 @@
[gd_resource type="Resource" script_class="SceneTrigger" load_steps=20 format=3 uid="uid://bym4pb0ellj7b"] [gd_resource type="Resource" script_class="SceneTrigger" load_steps=19 format=3 uid="uid://bym4pb0ellj7b"]
[ext_resource type="Script" uid="uid://baamspwt4rm4r" path="res://addons/reedscene/scene/guard.gd" id="1_ebfhi"]
[ext_resource type="Script" uid="uid://ons77en82uls" path="res://addons/reedscene/scene/scene_trigger/base/SceneTrigger.gd" id="2_cq8o1"] [ext_resource type="Script" uid="uid://ons77en82uls" path="res://addons/reedscene/scene/scene_trigger/base/SceneTrigger.gd" id="2_cq8o1"]
[ext_resource type="Script" uid="uid://dxj5vimigc651" path="res://addons/reedscene/scene/scene_trigger/base/SceneTriggerEffectPair.gd" id="3_m0qh3"] [ext_resource type="Script" uid="uid://dxj5vimigc651" path="res://addons/reedscene/scene/scene_trigger/base/SceneTriggerEffectPair.gd" id="3_m0qh3"]
[ext_resource type="Script" uid="uid://b1bgmb71bapws" path="res://addons/reedscene/scene/scene_trigger/base/SceneTriggerEffect.gd" id="4_g7ixm"] [ext_resource type="Script" uid="uid://b1bgmb71bapws" path="res://addons/reedscene/scene/scene_trigger/base/SceneTriggerEffect.gd" id="4_g7ixm"]

View File

@ -35,26 +35,21 @@ func get_player_controller() -> PlayerController:
return _cached_player_controller return _cached_player_controller
func player_follow_camera() -> void: func player_follow_camera() -> void:
if not _cached_player:return
var cam := ReedCameraSystem.get_current_camera_pointer() as CameraPointer var cam := ReedCameraSystem.get_current_camera_pointer() as CameraPointer
if not cam:return if not cam:return
var follower := cam.get_tool_by_type(CameraPointer.ToolType.FOLLOWER) var follower := cam.get_tool_by_type(CameraPointer.ToolType.FOLLOWER)
if not follower:return if not follower:return
follower.register_follower(_cached_player)
_camera_follower = follower _camera_follower = follower
if not _cached_player:return
follower.register_follower(_cached_player)
func player_unfollow_camera() -> void: func player_unfollow_camera() -> void:
var cam := ReedCameraSystem.get_current_camera_pointer() as CameraPointer if _camera_follower:
if not cam:return _camera_follower.unregister_follower()
_camera_follower = null
var follower := cam.get_tool_by_type(CameraPointer.ToolType.FOLLOWER)
if not follower:return
follower.unregister_follower()
_camera_follower = null
## 外部用于监听Player死亡 ## 外部用于监听Player死亡
func boradcast_player_dead_event(player:Player) -> void: func boradcast_player_dead_event(player:Player) -> void:

79
_tileset/level1.tres Normal file
View File

@ -0,0 +1,79 @@
[gd_resource type="TileSet" load_steps=3 format=3 uid="uid://cup1q1upvp18h"]
[ext_resource type="Texture2D" uid="uid://cew1x7g5aaa3j" path="res://_asset/ksw/basicTile.png" id="1_ln1fl"]
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_ln1fl"]
texture = ExtResource("1_ln1fl")
texture_region_size = Vector2i(96, 96)
1:1/0 = 0
2:1/0 = 0
2:2/0 = 0
3:2/0 = 0
3:3/0 = 0
3:1/0 = 0
1:2/0 = 0
1:3/0 = 0
2:3/0 = 0
6:1/0 = 0
7:1/0 = 0
8:1/0 = 0
8:2/0 = 0
8:3/0 = 0
7:3/0 = 0
6:3/0 = 0
6:2/0 = 0
7:2/0 = 0
10:1/0 = 0
11:1/0 = 0
12:1/0 = 0
9:5/0 = 0
10:6/0 = 0
11:5/0 = 0
10:5/0 = 0
9:6/0 = 0
11:6/0 = 0
7:5/0 = 0
7:6/0 = 0
6:6/0 = 0
6:5/0 = 0
3:5/0 = 0
3:6/0 = 0
4:6/0 = 0
4:5/0 = 0
1:5/0 = 0
1:6/0 = 0
1:7/0 = 0
1:9/0 = 0
1:10/0 = 0
2:10/0 = 0
2:9/0 = 0
1:8/0 = 0
4:9/0 = 0
4:10/0 = 0
5:10/0 = 0
5:9/0 = 0
5:8/0 = 0
7:8/0 = 0
8:8/0 = 0
8:9/0 = 0
8:10/0 = 0
7:9/0 = 0
6:9/0 = 0
10:9/0 = 0
11:9/0 = 0
11:10/0 = 0
10:10/0 = 0
9:9/0 = 0
9:10/0 = 0
10:8/0 = 0
11:8/0 = 0
8:5/0 = 0
9:4/0 = 0
11:4/0 = 0
7:4/0 = 0
3:4/0 = 0
1:4/0 = 0
[resource]
tile_size = Vector2i(96, 96)
sources/0 = SubResource("TileSetAtlasSource_ln1fl")

View File

@ -11,6 +11,10 @@ const _DEBUG_TOOL := preload("res://addons/reedcamera/scripts/camera_tools/DeadZ
@export var enabled_follow: bool = true @export var enabled_follow: bool = true
@export var follow_speed: float = 600.0 # 世界单位 / 秒 @export var follow_speed: float = 600.0 # 世界单位 / 秒
@export var follow_lerp := 0.12 # 0~1越大越“跟手”越小越“蔚蓝感”的滞后 @export var follow_lerp := 0.12 # 0~1越大越“跟手”越小越“蔚蓝感”的滞后
@export_subgroup("Follow Dynamic Speed")
@export var min_speed_scale := 0.4 # 贴近死区时
@export var max_speed_scale := 2.0 # 远离死区时
@export var max_offset_ratio := 1.0 # offset 达到 1 个 dead_zone 时为最大速率
##TODO:后续添加一下Runtime的修改逻辑 ##TODO:后续添加一下Runtime的修改逻辑
@export_group("Debug") @export_group("Debug")
@ -110,9 +114,20 @@ func update_follow(delta: float) -> void:
_current_state = State.CHASING _current_state = State.CHASING
#var move_dir := offset.normalized()
#var world_velocity := (move_dir * follow_speed) / cam.zoom
var offset_len := offset.length()
var dead_len := dead_half.length()
# 0~1 的距离比例
var t := clamp(offset_len / (dead_len * max_offset_ratio), 0.0, 1.0)
# 距离越远,速度越快
var speed_scale := lerp(min_speed_scale, max_speed_scale, t)
var move_dir := offset.normalized() var move_dir := offset.normalized()
var world_velocity := (move_dir * follow_speed) / cam.zoom var world_velocity : Vector2 = (move_dir * follow_speed * speed_scale) / cam.zoom
##如果存在move_dir则我们认为相机需要chasing player
var desired_pos := _final_position + world_velocity * delta var desired_pos := _final_position + world_velocity * delta

View File

@ -54,48 +54,6 @@ func _bind_quick_trigger() -> void:
func(...args): func(...args):
_on_trigger_fired(st, args) _on_trigger_fired(st, args)
) )
#if qt is PropIDSceneTrigger:
#_bind_prop_id_trigger(qt)
#elif qt is NodePathSceneTrigger:
#_bind_node_path_trigger(qt)
### 通过Prop id来绑定signal
#func _bind_prop_id_trigger(trigger: PropIDSceneTrigger) -> void:
#var prop : Node = _props.get(trigger.prop_id).get_parent()
#if prop == null:
#return
#
#var s: StringName = trigger.monitor_signal
#if not prop.has_signal(s):
#push_error("Prop has no signal: %s" % trigger.monitor_signal)
#return
#
#prop.connect(
#trigger.monitor_signal,
#func(...args):
#_on_trigger_fired(trigger, args)
#)
#
### 通过NodePath来绑定signal
#func _bind_node_path_trigger(trigger: NodePathSceneTrigger) -> void:
#if trigger.path.is_empty():
#return
#
#var n : Node = self.get_node_or_null(trigger.path)
#
#if n == null:
#return
#
#var s: StringName = trigger.monitor_signal
#if not n.has_signal(s):
#push_error("Prop has no signal: %s" % trigger.monitor_signal)
#return
#
#n.connect(
#trigger.monitor_signal,
#func(...args):
#_on_trigger_fired(trigger, args)
#)
## 当信号触发 ## 当信号触发
func _on_trigger_fired(trigger: SceneTrigger, signal_args: Array) -> void: func _on_trigger_fired(trigger: SceneTrigger, signal_args: Array) -> void:
@ -115,13 +73,6 @@ func _on_trigger_fired(trigger: SceneTrigger, signal_args: Array) -> void:
for j in exs: for j in exs:
var ex := j as SceneTriggerEffect var ex := j as SceneTriggerEffect
ex.apply_effect(t) ex.apply_effect(t)
#var target_act_id: int = trigger.target_act_id
#var trans_overwrite: int = trigger.trans_overwrite
#
#if target_act_id < 0:
#return
#
#_act_manager.switch_act_with_id(target_act_id,trans_overwrite)
func switch_act_with_id(id: int,trans_overwrite:int = 0) -> void: func switch_act_with_id(id: int,trans_overwrite:int = 0) -> void:
_act_manager.switch_act_with_id(id,trans_overwrite) _act_manager.switch_act_with_id(id,trans_overwrite)

View File

@ -3,15 +3,13 @@ class_name SceneTrigger extends Resource
##绑定哪个Node的哪个函数作为此Trigger的Register。 ##绑定哪个Node的哪个函数作为此Trigger的Register。
@export var trigger_register_conifg: SceneTriggerRegister @export var trigger_register_conifg: SceneTriggerRegister
##Guard是一个保护项如果某个Trigger触发后但因为某些条件并不想被执行可以使用guard进行保护 ##Guard是一个保护项如果某个Trigger触发后但因为某些条件并不想被执行可以使用guard进行保护
@export var guards: Array[SceneGuard] @export var guard: SceneGuard
##当某个Trigger被激活时可以应用任意多个EffectEffect会按序执行列 ##当某个Trigger被激活时可以应用任意多个EffectEffect会按序执行列
@export var trigger_effect_pairs: Array[SceneTriggerEffectPair] @export var trigger_effect_pairs: Array[SceneTriggerEffectPair]
var _owner: Node var _owner: Node
func can_trigger(args: Array) -> bool: func can_trigger(args: Array) -> bool:
for g in guards: if not guard.check(args):
if not g.check(args): return false
return false
return true return true