1
1
mirror of https://github.com/Rundll86/Dog-Lynx-And-HCN.git synced 2026-05-28 06:51:54 +08:00
Files
Dog-Lynx-And-HCN/scripts/Contents/Panels/Starter.gd
T
fallingshrimp 30d50b2fd9 feat(多人游戏): 完善玩家列表同步功能
添加玩家加入/离开时的同步逻辑,重构玩家列表更新方式
- 新增玩家加入和离开的RPC方法
- 使用rebuildAllPlayers统一更新玩家列表
- 调整UI面板的可见性控制
2025-11-09 22:37:47 +08:00

112 lines
3.8 KiB
GDScript

@tool
extends FullscreenPanelBase
@onready var diffEdit: HSlider = $"%diffEdit"
@onready var startBtn: Button = $"%startBtn"
@onready var startMultiplayerBtn: Button = $"%startMultiplayerBtn"
@onready var levelShow: Label = $"%levelShow"
@onready var hostInput: LineEdit = $"%hostInput"
@onready var portInput: LineEdit = $"%portInput"
@onready var launchBtn: Button = $"%launchBtn"
@onready var connectBtn: Button = $"%connectBtn"
@onready var maxPlayerInput: LineEdit = $"%maxPlayerInput"
@onready var connectionState: Label = $"%connectionState"
@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):
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
diffEdit.max_value = GameRule.difficultyRange.y
multiplayer.connection_failed.connect(
func():
setState(MultiplayerState.ConnectionState.DISCONNECTED)
)
multiplayer.connected_to_server.connect(
func():
joinPlayer.rpc(playerNameInput.text)
setState(MultiplayerState.ConnectionState.CONNECTED_CLIENT)
)
startBtn.pressed.connect(
func():
EntityBase.generatePlayer(playerNameInput.text)
Wave.next()
UIState.closeCurrentPanel()
)
startMultiplayerBtn.pressed.connect(
func():
pass
)
maxPlayerInput.text_changed.connect(
func(text):
MultiplayerState.maxPlayer = int(text)
)
launchBtn.pressed.connect(
func():
multiplayer.multiplayer_peer = MultiplayerState.launchServer(int(portInput.text))
joinPlayer(playerNameInput.text)
setState(MultiplayerState.ConnectionState.CONNECTED_HOST)
)
connectBtn.pressed.connect(
func():
multiplayer.multiplayer_peer = MultiplayerState.connectClient(hostInput.text, int(portInput.text))
setState(MultiplayerState.ConnectionState.CONNECTING)
)
disconnectBtn.pressed.connect(
func():
leavePlayer.rpc(playerNameInput.text)
setState(MultiplayerState.ConnectionState.DISCONNECTED)
)
playerNameInput.text_changed.connect(
func(text):
setPlayerName.rpc(playerNameInput.text, text)
)
setState(MultiplayerState.ConnectionState.DISCONNECTED)
func _physics_process(_delta):
levelShow.text = "%d ∈ [%d, %d]" % [diffEdit.value, diffEdit.min_value, diffEdit.max_value]
GameRule.difficulty = diffEdit.value
func setState(state: MultiplayerState.ConnectionState):
MultiplayerState.state = state
connectionState.text = "状态:%s" % MultiplayerState.stateTextMap[state]
connectionState.modulate = MultiplayerState.stateColorMap[state]
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