mirror of
https://github.com/Rundll86/Dog-Lynx-And-HCN.git
synced 2026-07-11 20:42:55 +08:00
refactor(网络同步): 重构实体同步逻辑和玩家生成流程
- 将EntityBase的health改为@export变量以便同步 - 添加MultiplayerSynchronizer节点处理网络同步 - 修改Wave.next()方法处理EncodedObjectAsID类型 - 添加findPlayer方法通过名称查找玩家 - 调整玩家生成流程,确保UIState.player正确设置
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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"))
|
||||||
|
|||||||
@@ -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():
|
||||||
|
|||||||
Reference in New Issue
Block a user