From 427ca484d189d807980f1167d81a6a8d6805781d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=A8=E8=90=BD=E5=9F=BA=E5=9B=B4=E8=99=BE?= <3161880837@qq.com> Date: Fri, 14 Nov 2025 22:44:26 +0800 Subject: [PATCH] =?UTF-8?q?refactor(=E7=BD=91=E7=BB=9C=E5=90=8C=E6=AD=A5):?= =?UTF-8?q?=20=E9=87=8D=E6=9E=84=E5=AE=9E=E4=BD=93=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E5=92=8C=E7=8E=A9=E5=AE=B6=E7=94=9F=E6=88=90?= =?UTF-8?q?=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将EntityBase的health改为@export变量以便同步 - 添加MultiplayerSynchronizer节点处理网络同步 - 修改Wave.next()方法处理EncodedObjectAsID类型 - 添加findPlayer方法通过名称查找玩家 - 调整玩家生成流程,确保UIState.player正确设置 --- components/Abstracts/EntityBase.tscn | 22 ++++++++++++++++++++-- scripts/Contents/Panels/Starter.gd | 1 + scripts/Contents/Wave.gd | 8 +++++--- scripts/Statemachine/EntityBase.gd | 13 +++++++++---- scripts/Tools/Managers/WorldManager.gd | 2 +- 5 files changed, 36 insertions(+), 10 deletions(-) diff --git a/components/Abstracts/EntityBase.tscn b/components/Abstracts/EntityBase.tscn index b97cd58..210159d 100644 --- a/components/Abstracts/EntityBase.tscn +++ b/components/Abstracts/EntityBase.tscn @@ -1,10 +1,24 @@ -[gd_scene load_steps=41 format=3 uid="uid://cvogxi7mktumf"] +[gd_scene load_steps=42 format=3 uid="uid://cvogxi7mktumf"] [ext_resource type="Script" uid="uid://ds3j3f82li68h" path="res://scripts/Statemachine/EntityBase.gd" id="1_mvol6"] [ext_resource type="Texture2D" uid="uid://dwwpkn4q07ja2" path="res://icon.svg" id="2_7lpu0"] [ext_resource type="AudioStream" uid="uid://cn876dtp1ypqx" path="res://resources/sounds/effect/Collect.wav" id="2_qt0aq"] [ext_resource type="PackedScene" uid="uid://dcjqjqere8ets" path="res://components/UI/EntityStateBar.tscn" id="2_uje1g"] +[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_tiuhe"] +properties/0/path = NodePath(".:displayName") +properties/0/spawn = true +properties/0/replication_mode = 1 +properties/1/path = NodePath(".:position") +properties/1/spawn = true +properties/1/replication_mode = 1 +properties/2/path = NodePath("texture/animator/animatree:parameters/blend_position") +properties/2/spawn = true +properties/2/replication_mode = 1 +properties/3/path = NodePath(".:health") +properties/3/spawn = true +properties/3/replication_mode = 1 + [sub_resource type="SpriteFrames" id="SpriteFrames_wcqpm"] animations = [{ "frames": [{ @@ -374,10 +388,14 @@ alpha_curve = SubResource("CurveTexture_vvfxd") [sub_resource type="CircleShape2D" id="CircleShape2D_34h7q"] -[node name="HJM" type="CharacterBody2D"] +[node name="EntityBase" type="CharacterBody2D"] collision_layer = 0 script = ExtResource("1_mvol6") +[node name="syncer" type="MultiplayerSynchronizer" parent="."] +unique_name_in_owner = true +replication_config = SubResource("SceneReplicationConfig_tiuhe") + [node name="weaponStore" type="Node2D" parent="."] unique_name_in_owner = true diff --git a/scripts/Contents/Panels/Starter.gd b/scripts/Contents/Panels/Starter.gd index cb71bb9..3ce0920 100644 --- a/scripts/Contents/Panels/Starter.gd +++ b/scripts/Contents/Panels/Starter.gd @@ -63,6 +63,7 @@ func startMultiplayerGame(): func startSingleplayerGame(): MultiplayerState.isMultiplayer = false EntityBase.generatePlayer(playerNameInput.text) + UIState.player = EntityBase.findPlayer(playerNameInput.text) WorldManager.rootNode.spawnWave() UIState.closeCurrentPanel() diff --git a/scripts/Contents/Wave.gd b/scripts/Contents/Wave.gd index 9496d4c..17443eb 100644 --- a/scripts/Contents/Wave.gd +++ b/scripts/Contents/Wave.gd @@ -71,8 +71,8 @@ static func entityCountOf(wave: Wave) -> int: else: return randi_range(ceil(wave.minCount), floor(wave.maxCount * (1 + GameRule.entityCountBoostPerWave * current))) return 0 -static func spawn() -> Array[Wave]: - var result: Array[Wave] = [] +static func spawn() -> Array: + var result: Array = [] for i in range(len(data)): var wave: Wave = data[i] for j in range(entityCountOf(wave)): @@ -80,8 +80,10 @@ static func spawn() -> Array[Wave]: currentWave.entityPosition = MathTool.randv2_range(500) result.append(currentWave) return result -static func next(waves: Array[Wave]): +static func next(waves: Array): for wave in waves: + if wave is EncodedObjectAsID: + wave = instance_from_id(wave.get_instance_id()) EntityBase.generate(ComponentManager.getCharacter(wave.entity), wave.entityPosition, true, wave.isBoss) current += 1 static func startWith(wave: int): diff --git a/scripts/Statemachine/EntityBase.gd b/scripts/Statemachine/EntityBase.gd index f07d059..59224a1 100644 --- a/scripts/Statemachine/EntityBase.gd +++ b/scripts/Statemachine/EntityBase.gd @@ -87,9 +87,10 @@ var inventoryMax = { @onready var damageAnchor: Node2D = $"%damageAnchor" @onready var trailParticle: GPUParticles2D = $"%trailParticle" @onready var weaponStore: Node2D = $"%weaponStore" +@onready var syncer: MultiplayerSynchronizer = $"%syncer" var statebar: EntityStateBar -var health: float = 0 +@export var health: float = 0 var energy: float = 0 var sprinting: bool = false var targetableSprinting: bool = false @@ -121,7 +122,6 @@ func _ready(): weapons.append(i) weaponBag.append(i.displayName) statebar.levelLabels.hide() - if !is_instance_valid(UIState.player): UIState.player = self energyChanged.connect( func(newEnergy, dontChangeDirection): if !UIState.player == self: return @@ -434,8 +434,13 @@ func enterStage(_stage: int): func kill(): pass +static func findPlayer(playerName: String) -> EntityBase: + for i in WorldManager.tree.get_nodes_in_group("players"): + if i.displayName == playerName: + return i + return null static func generatePlayer(playerName: String) -> EntityBase: - var player = generate(ComponentManager.getCharacter("Rooster"), Vector2.ZERO, false, false, true) + var player = generate(ComponentManager.getCharacter("Rooster"), Vector2.ZERO, false) player.displayName = playerName player.name = "Player_%s" % playerName return player @@ -455,7 +460,7 @@ static func generate( else: instance.add_to_group("players") if addToWorld: - WorldManager.rootNode.add_child(instance) + WorldManager.rootNode.spawn(instance) return instance static func mobCount(): return len(WorldManager.tree.get_nodes_in_group("mobs")) diff --git a/scripts/Tools/Managers/WorldManager.gd b/scripts/Tools/Managers/WorldManager.gd index 20324ca..6c564f1 100644 --- a/scripts/Tools/Managers/WorldManager.gd +++ b/scripts/Tools/Managers/WorldManager.gd @@ -18,7 +18,7 @@ func _physics_process(delta): UIState.setPanel("MakeFeed") @rpc("authority") -func nextWave(waves: Array[Wave]): +func nextWave(waves: Array): Wave.next(waves) func spawnWave():