开始菜单、玩家选择、脸部绘制
This commit is contained in:
+53
-13
@@ -1,30 +1,70 @@
|
||||
extends Control
|
||||
## 游戏开始菜单 —— 只有界面,没有逻辑。
|
||||
## 游戏开始菜单 —— 项目的入口场景(project.godot 的 run/main_scene)。
|
||||
##
|
||||
## 四个按钮按下去只把对应信号发出去:谁接、接了之后是加载世界、连服务器还是弹设置面板,
|
||||
## 都不在这个文件里。这样菜单版式可以单独改,主流程也能单独换。
|
||||
## 「开始游戏」→ 角色选择 → 确定 = 开主机并进世界。这个项目是客户端-服务器模型,
|
||||
## 单人玩也是本机开服(没有单独的「离线模式」)。
|
||||
## 「联机」把 Net 的创建/加入面板放出来,那边选完同样会切进世界。
|
||||
##
|
||||
## 接线示例(放在外层,比如以后的主场景或一个菜单流程单例):
|
||||
## menu.start_pressed.connect(_on_start)
|
||||
## menu.multiplayer_pressed.connect(_on_multiplayer)
|
||||
## 进世界、回菜单这两件事都归 Net 管(见 net.gd 的 _enter_world / leave_game),
|
||||
## 菜单只负责「按了哪个按钮」。
|
||||
##
|
||||
## 接线示例(放在外层):
|
||||
## menu.settings_pressed.connect(_on_settings)
|
||||
## menu.quit_pressed.connect(get_tree().quit)
|
||||
##
|
||||
## 用法:把本场景设成 project.godot 的 application/run/main_scene 即可(这一步也没做)。
|
||||
|
||||
const CHARACTER_SELECT := preload("res://ui/character_select.tscn")
|
||||
## 用节点路径而不是全局标识符访问单例:autoload 的全局名只在引擎启动时注册,
|
||||
## 这样写不依赖注册时机(和 world/main.gd 一致)
|
||||
const NET_PATH := "/root/Net"
|
||||
|
||||
signal start_pressed
|
||||
signal multiplayer_pressed
|
||||
signal settings_pressed
|
||||
signal quit_pressed
|
||||
|
||||
var _net: Node
|
||||
var _character_select: Control
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
# 从游戏内退回菜单时鼠标可能还是被捕获的,先放出来 —— 不然菜单点不动。
|
||||
# 这不算逻辑,是菜单能不能用的前提。
|
||||
# 从游戏内退回菜单时鼠标可能还是被捕获的,先放出来 —— 不然菜单点不动
|
||||
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
||||
_net = get_node_or_null(NET_PATH)
|
||||
# Net 那个「联机测试」面板默认可见(CanvasLayer layer 20),会正好盖在菜单中间
|
||||
if _net != null:
|
||||
_net.set_menu_visible(false)
|
||||
|
||||
# 按钮只负责把 pressed 转发成信号,不在这里做任何决定。
|
||||
%StartButton.pressed.connect(start_pressed.emit)
|
||||
%MultiplayerButton.pressed.connect(multiplayer_pressed.emit)
|
||||
%StartButton.pressed.connect(_on_start_pressed)
|
||||
%MultiplayerButton.pressed.connect(_on_multiplayer_pressed)
|
||||
%SettingsButton.pressed.connect(settings_pressed.emit)
|
||||
%QuitButton.pressed.connect(quit_pressed.emit)
|
||||
|
||||
|
||||
## 「开始游戏」:先把信号发出去(外部想接就接),再把角色选择盖上来
|
||||
func _on_start_pressed() -> void:
|
||||
start_pressed.emit()
|
||||
if _character_select == null:
|
||||
_character_select = CHARACTER_SELECT.instantiate()
|
||||
add_child(_character_select)
|
||||
_character_select.confirmed.connect(_on_character_confirmed)
|
||||
_character_select.back_pressed.connect(_close_character_select)
|
||||
_character_select.visible = true
|
||||
|
||||
|
||||
## 角色选择点「确定」:脸这时已经写进 user:// 了,开主机,Net 负责切进世界
|
||||
func _on_character_confirmed() -> void:
|
||||
_close_character_select()
|
||||
if _net != null:
|
||||
_net.host_game()
|
||||
|
||||
|
||||
func _on_multiplayer_pressed() -> void:
|
||||
multiplayer_pressed.emit()
|
||||
# 暂时直接把 Net 那个创建/加入面板放出来顶着 —— 换成正经的联机子页后删掉这行
|
||||
if _net != null:
|
||||
_net.set_menu_visible(true)
|
||||
|
||||
|
||||
func _close_character_select() -> void:
|
||||
if _character_select != null:
|
||||
_character_select.visible = false
|
||||
|
||||
Reference in New Issue
Block a user