From 30d50b2fd9c44bf3e55b3aa2aaa1768ef6fec77a 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, 9 Nov 2025 22:37:47 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=A4=9A=E4=BA=BA=E6=B8=B8=E6=88=8F):=20?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E7=8E=A9=E5=AE=B6=E5=88=97=E8=A1=A8=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加玩家加入/离开时的同步逻辑,重构玩家列表更新方式 - 新增玩家加入和离开的RPC方法 - 使用rebuildAllPlayers统一更新玩家列表 - 调整UI面板的可见性控制 --- .../Scenes/FullscreenPanels/Starter.tscn | 2 ++ scripts/Contents/Panels/Starter.gd | 30 ++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/components/Scenes/FullscreenPanels/Starter.tscn b/components/Scenes/FullscreenPanels/Starter.tscn index 6d21c9d..65b6a7f 100644 --- a/components/Scenes/FullscreenPanels/Starter.tscn +++ b/components/Scenes/FullscreenPanels/Starter.tscn @@ -183,6 +183,7 @@ alignment = 1 [node name="serverConfig" type="VBoxContainer" parent="content/wrapper/starter/multiplayer/configs" index="0"] unique_name_in_owner = true +visible = false layout_mode = 2 [node name="title" type="Label" parent="content/wrapper/starter/multiplayer/configs/serverConfig" index="0"] @@ -212,6 +213,7 @@ virtual_keyboard_type = 2 select_all_on_focus = true [node name="players" type="VBoxContainer" parent="content/wrapper/starter/multiplayer/configs" index="1"] +unique_name_in_owner = true layout_mode = 2 [node name="title" type="Label" parent="content/wrapper/starter/multiplayer/configs/players" index="0"] diff --git a/scripts/Contents/Panels/Starter.gd b/scripts/Contents/Panels/Starter.gd index 4b04b7e..4134cb4 100644 --- a/scripts/Contents/Panels/Starter.gd +++ b/scripts/Contents/Panels/Starter.gd @@ -14,16 +14,30 @@ extends FullscreenPanelBase @onready var disconnectBtn: Button = $"%disconnectBtn" @onready var playerNameInput: LineEdit = $"%playerNameInput" @onready var serverConfig: VBoxContainer = $"%serverConfig" +@onready var players: VBoxContainer = $"%players" @onready var playersList: VBoxContainer = $"%list" @rpc("any_peer") func joinPlayer(player: String): - playersList.add_child(QuickUI.graySmallText(player)) + if multiplayer.is_server(): + addPlayerName(player) + rebuildAllPlayers.rpc(getPlayerNames()) +@rpc("any_peer") +func leavePlayer(playerName: String): + if multiplayer.is_server(): + removePlayerName(playerName) + rebuildAllPlayers.rpc(getPlayerNames()) @rpc("any_peer") func setPlayerName(oldName: String, newName: String): for i in playersList.get_children(): if i.text == oldName: i.text = newName +@rpc("any_peer") +func rebuildAllPlayers(playerNames: Array[String]): + for i in playersList.get_children(): + i.queue_free() + for i in playerNames: + addPlayerName(i) func _ready(): diffEdit.min_value = GameRule.difficultyRange.x @@ -54,6 +68,7 @@ func _ready(): launchBtn.pressed.connect( func(): multiplayer.multiplayer_peer = MultiplayerState.launchServer(int(portInput.text)) + joinPlayer(playerNameInput.text) setState(MultiplayerState.ConnectionState.CONNECTED_HOST) ) connectBtn.pressed.connect( @@ -63,6 +78,7 @@ func _ready(): ) disconnectBtn.pressed.connect( func(): + leavePlayer.rpc(playerNameInput.text) setState(MultiplayerState.ConnectionState.DISCONNECTED) ) playerNameInput.text_changed.connect( @@ -81,3 +97,15 @@ func setState(state: MultiplayerState.ConnectionState): disconnectBtn.disabled = not MultiplayerState.isConnected() startMultiplayerBtn.disabled = not MultiplayerState.isConnected() serverConfig.visible = MultiplayerState.state == MultiplayerState.ConnectionState.CONNECTED_HOST + players.visible = MultiplayerState.isConnected() +func addPlayerName(playerName: String): + playersList.add_child(QuickUI.graySmallText(playerName)) +func removePlayerName(playerName: String): + for i in playersList.get_children(): + if i.text == playerName: + i.queue_free() +func getPlayerNames() -> Array[String]: + var result: Array[String] = [] + for i in playersList.get_children(): + result.append(i.text) + return result