mirror of
https://github.com/Rundll86/Dog-Lynx-And-HCN.git
synced 2026-05-27 22:41:56 +08:00
feat(多人游戏): 完善玩家列表同步功能
添加玩家加入/离开时的同步逻辑,重构玩家列表更新方式 - 新增玩家加入和离开的RPC方法 - 使用rebuildAllPlayers统一更新玩家列表 - 调整UI面板的可见性控制
This commit is contained in:
@@ -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"]
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user