分离UI
This commit is contained in:
+23
-98
@@ -1,10 +1,14 @@
|
||||
extends Node
|
||||
## 联机总入口(Autoload 名:Net)
|
||||
extends CanvasLayer
|
||||
## 联机总入口(Autoload 名:Net,指向 res://autoload/net.tscn)
|
||||
##
|
||||
## 职责边界:只负责「选传输层 + 开局/加入/断开 + 玩家生成回收」。
|
||||
## 玩法代码不直接接触 MultiplayerPeer —— 以后要把 ENet 换成 Steam P2P,
|
||||
## 只需要改本文件的 host_game / join_game 两个函数,RPC 与 Spawner 层不用动。
|
||||
##
|
||||
## 界面是**节点配置**:整个 UI 在 res://autoload/net.tscn 里用节点搭好,
|
||||
## 本脚本只做「改文字、切显隐」这类状态更新,不动态创建任何 Control。
|
||||
## 按钮的 pressed 信号也在 net.tscn 里连接(打开场景 → 选按钮 → 节点面板 → 信号)。
|
||||
##
|
||||
## 本机双开调试(命令行):
|
||||
## godot --path <项目目录> -- --host
|
||||
## godot --path <项目目录> -- --join 127.0.0.1
|
||||
@@ -16,11 +20,12 @@ const DEFAULT_ADDRESS: String = "127.0.0.1"
|
||||
const PLAYER_GROUP: String = "net_player"
|
||||
|
||||
var _spawner: MultiplayerSpawner = null
|
||||
var _menu_root: Control = null
|
||||
var _hud_root: Control = null
|
||||
var _address_edit: LineEdit = null
|
||||
var _menu_status: Label = null
|
||||
var _hud_status: Label = null
|
||||
|
||||
@onready var _menu: CenterContainer = $Menu
|
||||
@onready var _address_edit: LineEdit = $Menu/Panel/Box/AddressEdit
|
||||
@onready var _menu_status: Label = $Menu/Panel/Box/StatusLabel
|
||||
@onready var _hud: Control = $Hud
|
||||
@onready var _hud_status: Label = $Hud/Box/StatusLabel
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
@@ -29,7 +34,7 @@ func _ready() -> void:
|
||||
multiplayer.connected_to_server.connect(_on_connected_to_server)
|
||||
multiplayer.connection_failed.connect(_on_connection_failed)
|
||||
multiplayer.server_disconnected.connect(_on_server_disconnected)
|
||||
_build_ui()
|
||||
_show_menu_ui()
|
||||
call_deferred("_apply_cmdline")
|
||||
|
||||
|
||||
@@ -150,93 +155,14 @@ func _apply_cmdline() -> void:
|
||||
join_game(address)
|
||||
|
||||
|
||||
# ---------------- 界面 ----------------
|
||||
# ---------------- 界面(节点都在 net.tscn 里,这里只管状态) ----------------
|
||||
|
||||
func _build_ui() -> void:
|
||||
var menu_layer := CanvasLayer.new()
|
||||
menu_layer.name = "NetMenu"
|
||||
menu_layer.layer = 20
|
||||
add_child(menu_layer)
|
||||
_menu_root = _build_menu()
|
||||
menu_layer.add_child(_menu_root)
|
||||
|
||||
var hud_layer := CanvasLayer.new()
|
||||
hud_layer.name = "NetHud"
|
||||
hud_layer.layer = 19
|
||||
add_child(hud_layer)
|
||||
_hud_root = _build_hud()
|
||||
_hud_root.visible = false
|
||||
hud_layer.add_child(_hud_root)
|
||||
## 两个按钮的 pressed 信号在 net.tscn 里连到这里
|
||||
func _on_host_button_pressed() -> void:
|
||||
host_game()
|
||||
|
||||
|
||||
func _build_menu() -> Control:
|
||||
var center := CenterContainer.new()
|
||||
center.set_anchors_preset(Control.PRESET_FULL_RECT)
|
||||
|
||||
var panel := PanelContainer.new()
|
||||
center.add_child(panel)
|
||||
|
||||
var box := VBoxContainer.new()
|
||||
box.add_theme_constant_override("separation", 10)
|
||||
panel.add_child(box)
|
||||
|
||||
var title := Label.new()
|
||||
title.text = "联机测试"
|
||||
title.add_theme_font_size_override("font_size", 20)
|
||||
box.add_child(title)
|
||||
|
||||
_address_edit = LineEdit.new()
|
||||
_address_edit.text = DEFAULT_ADDRESS
|
||||
_address_edit.custom_minimum_size = Vector2(240, 0)
|
||||
box.add_child(_address_edit)
|
||||
|
||||
var host_button := Button.new()
|
||||
host_button.text = "创建主机"
|
||||
host_button.pressed.connect(host_game)
|
||||
box.add_child(host_button)
|
||||
|
||||
var join_button := Button.new()
|
||||
join_button.text = "加入主机"
|
||||
join_button.pressed.connect(_on_join_pressed)
|
||||
box.add_child(join_button)
|
||||
|
||||
_menu_status = Label.new()
|
||||
_menu_status.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
|
||||
_menu_status.custom_minimum_size = Vector2(240, 0)
|
||||
box.add_child(_menu_status)
|
||||
|
||||
var hint := Label.new()
|
||||
hint.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
|
||||
hint.custom_minimum_size = Vector2(240, 0)
|
||||
hint.modulate = Color(1, 1, 1, 0.7)
|
||||
hint.text = "局域网内填主机的内网 IP;本机双开测试填 %s" % DEFAULT_ADDRESS
|
||||
box.add_child(hint)
|
||||
|
||||
return center
|
||||
|
||||
|
||||
func _build_hud() -> Control:
|
||||
var layer_root := Control.new()
|
||||
layer_root.set_anchors_preset(Control.PRESET_FULL_RECT)
|
||||
layer_root.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
||||
|
||||
var box := VBoxContainer.new()
|
||||
box.position = Vector2(16, 12)
|
||||
box.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
||||
layer_root.add_child(box)
|
||||
|
||||
_hud_status = Label.new()
|
||||
box.add_child(_hud_status)
|
||||
|
||||
var hint := Label.new()
|
||||
hint.modulate = Color(1, 1, 1, 0.7)
|
||||
hint.text = "F10 断开 · Esc 释放鼠标"
|
||||
box.add_child(hint)
|
||||
|
||||
return layer_root
|
||||
|
||||
|
||||
func _on_join_pressed() -> void:
|
||||
func _on_join_button_pressed() -> void:
|
||||
join_game(_address_edit.text)
|
||||
|
||||
|
||||
@@ -248,19 +174,18 @@ func _unhandled_key_input(event: InputEvent) -> void:
|
||||
|
||||
|
||||
func _show_game_ui() -> void:
|
||||
_menu_root.visible = false
|
||||
_hud_root.visible = true
|
||||
_menu.visible = false
|
||||
_hud.visible = true
|
||||
_update_hud()
|
||||
|
||||
|
||||
func _show_menu_ui() -> void:
|
||||
_menu_root.visible = true
|
||||
_hud_root.visible = false
|
||||
_menu.visible = true
|
||||
_hud.visible = false
|
||||
|
||||
|
||||
func _set_status(text: String) -> void:
|
||||
if _menu_status != null:
|
||||
_menu_status.text = text
|
||||
_menu_status.text = text
|
||||
|
||||
|
||||
func _update_hud() -> void:
|
||||
|
||||
Reference in New Issue
Block a user