1
1
mirror of https://github.com/Rundll86/Dog-Lynx-And-HCN.git synced 2026-07-11 04:22:54 +08:00

refactor(网络同步): 重构实体同步逻辑和玩家生成流程

- 将EntityBase的health改为@export变量以便同步
- 添加MultiplayerSynchronizer节点处理网络同步
- 修改Wave.next()方法处理EncodedObjectAsID类型
- 添加findPlayer方法通过名称查找玩家
- 调整玩家生成流程,确保UIState.player正确设置
This commit is contained in:
2025-11-14 22:44:26 +08:00
parent 9e0b713ef7
commit 427ca484d1
5 changed files with 36 additions and 10 deletions
+20 -2
View File
@@ -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="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="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="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"] [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"] [sub_resource type="SpriteFrames" id="SpriteFrames_wcqpm"]
animations = [{ animations = [{
"frames": [{ "frames": [{
@@ -374,10 +388,14 @@ alpha_curve = SubResource("CurveTexture_vvfxd")
[sub_resource type="CircleShape2D" id="CircleShape2D_34h7q"] [sub_resource type="CircleShape2D" id="CircleShape2D_34h7q"]
[node name="HJM" type="CharacterBody2D"] [node name="EntityBase" type="CharacterBody2D"]
collision_layer = 0 collision_layer = 0
script = ExtResource("1_mvol6") 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="."] [node name="weaponStore" type="Node2D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
+1
View File
@@ -63,6 +63,7 @@ func startMultiplayerGame():
func startSingleplayerGame(): func startSingleplayerGame():
MultiplayerState.isMultiplayer = false MultiplayerState.isMultiplayer = false
EntityBase.generatePlayer(playerNameInput.text) EntityBase.generatePlayer(playerNameInput.text)
UIState.player = EntityBase.findPlayer(playerNameInput.text)
WorldManager.rootNode.spawnWave() WorldManager.rootNode.spawnWave()
UIState.closeCurrentPanel() UIState.closeCurrentPanel()
+5 -3
View File
@@ -71,8 +71,8 @@ static func entityCountOf(wave: Wave) -> int:
else: else:
return randi_range(ceil(wave.minCount), floor(wave.maxCount * (1 + GameRule.entityCountBoostPerWave * current))) return randi_range(ceil(wave.minCount), floor(wave.maxCount * (1 + GameRule.entityCountBoostPerWave * current)))
return 0 return 0
static func spawn() -> Array[Wave]: static func spawn() -> Array:
var result: Array[Wave] = [] var result: Array = []
for i in range(len(data)): for i in range(len(data)):
var wave: Wave = data[i] var wave: Wave = data[i]
for j in range(entityCountOf(wave)): for j in range(entityCountOf(wave)):
@@ -80,8 +80,10 @@ static func spawn() -> Array[Wave]:
currentWave.entityPosition = MathTool.randv2_range(500) currentWave.entityPosition = MathTool.randv2_range(500)
result.append(currentWave) result.append(currentWave)
return result return result
static func next(waves: Array[Wave]): static func next(waves: Array):
for wave in waves: 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) EntityBase.generate(ComponentManager.getCharacter(wave.entity), wave.entityPosition, true, wave.isBoss)
current += 1 current += 1
static func startWith(wave: int): static func startWith(wave: int):
+9 -4
View File
@@ -87,9 +87,10 @@ var inventoryMax = {
@onready var damageAnchor: Node2D = $"%damageAnchor" @onready var damageAnchor: Node2D = $"%damageAnchor"
@onready var trailParticle: GPUParticles2D = $"%trailParticle" @onready var trailParticle: GPUParticles2D = $"%trailParticle"
@onready var weaponStore: Node2D = $"%weaponStore" @onready var weaponStore: Node2D = $"%weaponStore"
@onready var syncer: MultiplayerSynchronizer = $"%syncer"
var statebar: EntityStateBar var statebar: EntityStateBar
var health: float = 0 @export var health: float = 0
var energy: float = 0 var energy: float = 0
var sprinting: bool = false var sprinting: bool = false
var targetableSprinting: bool = false var targetableSprinting: bool = false
@@ -121,7 +122,6 @@ func _ready():
weapons.append(i) weapons.append(i)
weaponBag.append(i.displayName) weaponBag.append(i.displayName)
statebar.levelLabels.hide() statebar.levelLabels.hide()
if !is_instance_valid(UIState.player): UIState.player = self
energyChanged.connect( energyChanged.connect(
func(newEnergy, dontChangeDirection): func(newEnergy, dontChangeDirection):
if !UIState.player == self: return if !UIState.player == self: return
@@ -434,8 +434,13 @@ func enterStage(_stage: int):
func kill(): func kill():
pass 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: 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.displayName = playerName
player.name = "Player_%s" % playerName player.name = "Player_%s" % playerName
return player return player
@@ -455,7 +460,7 @@ static func generate(
else: else:
instance.add_to_group("players") instance.add_to_group("players")
if addToWorld: if addToWorld:
WorldManager.rootNode.add_child(instance) WorldManager.rootNode.spawn(instance)
return instance return instance
static func mobCount(): static func mobCount():
return len(WorldManager.tree.get_nodes_in_group("mobs")) return len(WorldManager.tree.get_nodes_in_group("mobs"))
+1 -1
View File
@@ -18,7 +18,7 @@ func _physics_process(delta):
UIState.setPanel("MakeFeed") UIState.setPanel("MakeFeed")
@rpc("authority") @rpc("authority")
func nextWave(waves: Array[Wave]): func nextWave(waves: Array):
Wave.next(waves) Wave.next(waves)
func spawnWave(): func spawnWave():