From 74d3e03fef149cca44c1c1326212043ea170268f 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: Sun, 14 Dec 2025 15:01:01 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=88=98=E6=96=97=E7=B3=BB=E7=BB=9F):=20?= =?UTF-8?q?=E6=94=B9=E8=BF=9B=E6=95=8C=E4=BA=BA=E7=94=9F=E6=88=90=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=BB=A5=E5=9B=B4=E7=BB=95=E7=8E=A9=E5=AE=B6=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改Wave.spawn方法以接受中心点参数,使敌人生成位置围绕玩家 在Starter和MakeFeed面板中调用spawnWave时计算玩家中心位置 重构EntityBase添加getPlayers方法获取所有玩家实体 重命名WorldManager.nextWave为doNextWave以更清晰表达意图 --- scripts/Contents/Panels/MakeFeed.gd | 6 +++++- scripts/Contents/Panels/Starter.gd | 2 +- scripts/Contents/Wave.gd | 4 ++-- scripts/Statemachine/EntityBase.gd | 16 +++++++++++++--- scripts/Tools/Managers/WorldManager.gd | 10 +++++----- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/scripts/Contents/Panels/MakeFeed.gd b/scripts/Contents/Panels/MakeFeed.gd index c26cb26..99a3212 100644 --- a/scripts/Contents/Panels/MakeFeed.gd +++ b/scripts/Contents/Panels/MakeFeed.gd @@ -50,7 +50,11 @@ func updateValue(): countLabel.text = str(UIState.player.fields[FieldStore.Entity.FEED_COUNT_CAN_MADE] - selectedCount) needBB.count = refreshNeedBaseballCount func finish(): - WorldManager.rootNode.spawnWave() + var center = Vector2.ZERO + for player in EntityBase.getPlayers(): + center += player.position + center /= len(EntityBase.getPlayers()) + WorldManager.rootNode.spawnWave(center) UIState.closeCurrentPanel() func regenerateCards(): updateValue() diff --git a/scripts/Contents/Panels/Starter.gd b/scripts/Contents/Panels/Starter.gd index 7622b7f..157174e 100644 --- a/scripts/Contents/Panels/Starter.gd +++ b/scripts/Contents/Panels/Starter.gd @@ -64,7 +64,7 @@ func startSingleplayerGame(): MultiplayerState.isMultiplayer = false MultiplayerState.playerName = playerNameInput.text EntityBase.generatePlayer(playerNameInput.text) - WorldManager.rootNode.spawnWave() + WorldManager.rootNode.spawnWave(Vector2.ZERO) UIState.closeCurrentPanel() func _ready(): diff --git a/scripts/Contents/Wave.gd b/scripts/Contents/Wave.gd index d73b394..cc6b255 100644 --- a/scripts/Contents/Wave.gd +++ b/scripts/Contents/Wave.gd @@ -82,13 +82,13 @@ static func entityCountOf(wave: Wave) -> int: elif !hasBoss(): return randi_range(ceil(wave.minCount), floor(wave.maxCount * (1 + GameRule.entityCountBoostPerWave * current))) return 0 -static func spawn() -> Array: +static func spawn(center: Vector2) -> Array: var result: Array = [] for i in range(len(data)): var wave: Wave = data[i] for j in range(entityCountOf(wave)): var currentWave = wave.duplicate() - currentWave.entityPosition = MathTool.randv2_range(500) + currentWave.entityPosition = MathTool.randv2_range(500) + center result.append(currentWave) return result static func next(waves: Array): diff --git a/scripts/Statemachine/EntityBase.gd b/scripts/Statemachine/EntityBase.gd index 547bcda..05c4b93 100644 --- a/scripts/Statemachine/EntityBase.gd +++ b/scripts/Statemachine/EntityBase.gd @@ -466,7 +466,7 @@ func kill(): pass static func findPlayer(playerName: String) -> EntityBase: - for i in WorldManager.tree.get_nodes_in_group("players"): + for i in getPlayers(): if i.displayName == playerName: return i return null @@ -493,5 +493,15 @@ static func generate( if addToWorld: WorldManager.rootNode.spawn(instance) return instance -static func getMobs(): - return WorldManager.tree.get_nodes_in_group("mobs") +static func getMobs() -> Array[EntityBase]: + var result: Array[EntityBase] = [] + for entity in WorldManager.tree.get_nodes_in_group("mobs"): + if entity: + result.append(entity) + return result +static func getPlayers() -> Array[EntityBase]: + var result: Array[EntityBase] = [] + for entity in WorldManager.tree.get_nodes_in_group("players"): + if entity: + result.append(entity) + return result diff --git a/scripts/Tools/Managers/WorldManager.gd b/scripts/Tools/Managers/WorldManager.gd index ea0755b..918b887 100644 --- a/scripts/Tools/Managers/WorldManager.gd +++ b/scripts/Tools/Managers/WorldManager.gd @@ -19,16 +19,16 @@ func _physics_process(delta): UIState.setPanel("MakeFeed") @rpc("authority") -func nextWave(waves: Array): +func doNextWave(waves: Array): Wave.next(waves) func canNextWave(): return len(EntityBase.getMobs()) == 0 and len(ItemDropped.getDropsCanCollet()) == 0 -func spawnWave(): - var waves = Wave.spawn() - nextWave(waves) +func spawnWave(center: Vector2): + var waves = Wave.spawn(center) + doNextWave(waves) if MultiplayerState.isMultiplayer and multiplayer.is_server(): - nextWave.rpc(waves) + doNextWave.rpc(waves) func spawn(node: Node): if MultiplayerState.isMultiplayer: if multiplayer.is_server():