From 12191f42333514924daea6dc3b253e5598f2e15e 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: Thu, 13 Nov 2025 22:39:36 +0800 Subject: [PATCH] =?UTF-8?q?refactor(wave):=20=E9=87=8D=E6=9E=84=E6=B3=A2?= =?UTF-8?q?=E6=AC=A1=E7=94=9F=E6=88=90=E9=80=BB=E8=BE=91=E4=BB=A5=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=A4=9A=E4=BA=BA=E6=B8=B8=E6=88=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将波次生成逻辑拆分为数据准备和实体生成两个阶段,便于多人游戏同步 修改 Wave 类以支持实例数据复制 更新相关调用点使用新的波次生成方式 --- scripts/Contents/Panels/MakeFeed.gd | 2 +- scripts/Contents/Panels/Starter.gd | 4 +-- scripts/Contents/Wave.gd | 37 +++++++++++++++++--------- scripts/Statemachine/EntityBase.gd | 2 +- scripts/Tools/Managers/WorldManager.gd | 16 ++++++++--- 5 files changed, 40 insertions(+), 21 deletions(-) diff --git a/scripts/Contents/Panels/MakeFeed.gd b/scripts/Contents/Panels/MakeFeed.gd index 82c93e8..0dd10f5 100644 --- a/scripts/Contents/Panels/MakeFeed.gd +++ b/scripts/Contents/Panels/MakeFeed.gd @@ -50,7 +50,7 @@ func updateValue(): countLabel.text = str(UIState.player.fields[FieldStore.Entity.FEED_COUNT_CAN_MADE] - selectedCount) needBB.count = refreshNeedBaseballCount func finish(): - Wave.next() + WorldManager.rootNode.spawnWave() UIState.closeCurrentPanel() func regenerateCards(): updateValue() diff --git a/scripts/Contents/Panels/Starter.gd b/scripts/Contents/Panels/Starter.gd index db9e6d2..cb71bb9 100644 --- a/scripts/Contents/Panels/Starter.gd +++ b/scripts/Contents/Panels/Starter.gd @@ -54,16 +54,16 @@ func rebuildAllPlayers(playerNames: Array[String]): @rpc("any_peer") func startMultiplayerGame(): MultiplayerState.isMultiplayer = true - WorldManager.rootNode.multiplayer.multiplayer_peer = MultiplayerState.connection MultiplayerState.playerName = playerNameInput.text MultiplayerState.connection = multiplayer.multiplayer_peer + WorldManager.rootNode.multiplayer.multiplayer_peer = multiplayer.multiplayer_peer for i in getPlayerNames(): EntityBase.generatePlayer(i) UIState.closeCurrentPanel() func startSingleplayerGame(): MultiplayerState.isMultiplayer = false EntityBase.generatePlayer(playerNameInput.text) - Wave.next() + WorldManager.rootNode.spawnWave() UIState.closeCurrentPanel() func _ready(): diff --git a/scripts/Contents/Wave.gd b/scripts/Contents/Wave.gd index 722fe1d..9496d4c 100644 --- a/scripts/Contents/Wave.gd +++ b/scripts/Contents/Wave.gd @@ -1,5 +1,6 @@ class_name Wave +# 元数据 var entity: String var minCount: int = 1 var maxCount: int = 1 @@ -7,6 +8,19 @@ var isBoss: bool = false var from: float = 0 var to: float = 0 var per: int = 0 +# 实例数据 +var entityPosition: Vector2 + +func duplicate() -> Wave: + var wave = Wave.new() + wave.entity = entity + wave.minCount = minCount + wave.maxCount = maxCount + wave.isBoss = isBoss + wave.from = from + wave.to = to + wave.per = per + return wave static var current: int = startWith(1) static var WAVE_NORMAL = [ @@ -32,12 +46,6 @@ static var WAVE_TESTBOSS_CHICK = [ static var WAVE_EMPTY = [] static var data = WAVE_NORMAL -static func customStart(): - if false: - var furryr = EntityBase.generate(ComponentManager.getCharacter("Bear"), MathTool.randv2_range(500), true, false) - var kukemc = EntityBase.generate(ComponentManager.getCharacter("KukeMC"), MathTool.randv2_range(500), true, false) - furryr.currentFocusedBoss = kukemc - kukemc.currentFocusedBoss = furryr static func create( entity_: String, minCount_: int = 1, @@ -63,15 +71,18 @@ 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(): +static func spawn() -> Array[Wave]: + var result: Array[Wave] = [] for i in range(len(data)): - var wave = data[i] + var wave: Wave = data[i] for j in range(entityCountOf(wave)): - EntityBase.generate(ComponentManager.getCharacter(wave.entity), MathTool.randv2_range(500), true, wave.isBoss) -static func next(): - if current == 0: - customStart() - spawn() + var currentWave = wave.duplicate() + currentWave.entityPosition = MathTool.randv2_range(500) + result.append(currentWave) + return result +static func next(waves: Array[Wave]): + for wave in waves: + EntityBase.generate(ComponentManager.getCharacter(wave.entity), wave.entityPosition, true, wave.isBoss) current += 1 static func startWith(wave: int): return wave - 1 diff --git a/scripts/Statemachine/EntityBase.gd b/scripts/Statemachine/EntityBase.gd index aa7f6ef..55d6944 100644 --- a/scripts/Statemachine/EntityBase.gd +++ b/scripts/Statemachine/EntityBase.gd @@ -445,7 +445,7 @@ func enterStage(_stage: int): func kill(): pass -static func generatePlayer(playerName: String): +static func generatePlayer(playerName: String) -> EntityBase: var player = generate(ComponentManager.getCharacter("Rooster"), Vector2.ZERO, false, false, true) player.displayName = playerName player.name = "Player_%s" % playerName diff --git a/scripts/Tools/Managers/WorldManager.gd b/scripts/Tools/Managers/WorldManager.gd index 7c4c8f4..5e2e582 100644 --- a/scripts/Tools/Managers/WorldManager.gd +++ b/scripts/Tools/Managers/WorldManager.gd @@ -12,10 +12,18 @@ func _ready(): ComponentManager.init() func _physics_process(delta): runningTime += delta * 1000 - if multiplayer.is_server() or not MultiplayerState.isMultiplayer: - if EntityBase.mobCount() == 0 and runningTime > 3000: - Wave.next() - UIState.setPanel("MakeFeed") + if EntityBase.mobCount() == 0 and runningTime > 1000: + UIState.setPanel("MakeFeed") + +@rpc("authority") +func nextWave(waves: Array[Wave]): + Wave.next(waves) + +func spawnWave(): + var waves = Wave.spawn() + nextWave(waves) + if MultiplayerState.isMultiplayer and multiplayer.is_server(): + nextWave.rpc(waves) static func getTime(): return runningTime