diff --git a/components/Scenes/FullscreenPanels/Starter.tscn b/components/Scenes/FullscreenPanels/Starter.tscn index 9c0c459..9698d6e 100644 --- a/components/Scenes/FullscreenPanels/Starter.tscn +++ b/components/Scenes/FullscreenPanels/Starter.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=8 format=3 uid="uid://c0r1i5tdbwljj"] +[gd_scene load_steps=10 format=3 uid="uid://c0r1i5tdbwljj"] [ext_resource type="PackedScene" uid="uid://d3qojeqa3difn" path="res://components/Abstracts/FullscreenPanelBase.tscn" id="1_o0yse"] [ext_resource type="Script" uid="uid://codlmfbuyis33" path="res://scripts/Contents/Panels/Starter.gd" id="2_ic0aq"] @@ -14,10 +14,16 @@ outline_size = 2 font_size = 20 outline_size = 1 +[sub_resource type="LabelSettings" id="LabelSettings_kl3ko"] +font_size = 14 + [sub_resource type="LabelSettings" id="LabelSettings_sdsu8"] font_size = 12 outline_size = 1 +[sub_resource type="LabelSettings" id="LabelSettings_i7qv0"] +font_size = 13 + [node name="Starter" instance=ExtResource("1_o0yse")] offset_top = 0.0 offset_bottom = 0.0 @@ -52,14 +58,12 @@ unique_name_in_owner = true custom_minimum_size = Vector2(100, 0) layout_mode = 2 size_flags_vertical = 4 -min_value = -5.0 -max_value = 5.0 -value = 1.0 +max_value = 0.0 [node name="levelShow" type="Label" parent="content/wrapper/starter/singleplayer/diffs" index="2"] unique_name_in_owner = true layout_mode = 2 -text = "1 ∈ [-5, 5]" +text = "0 ∈ [0, 0]" [node name="startBtn" type="Button" parent="content/wrapper/starter/singleplayer" index="1"] unique_name_in_owner = true @@ -70,25 +74,35 @@ text = "单人游戏" [node name="multiplayer" type="VBoxContainer" parent="content/wrapper/starter" index="1"] layout_mode = 2 -theme_override_constants/separation = 5 +theme_override_constants/separation = 15 alignment = 1 -[node name="title" type="Label" parent="content/wrapper/starter/multiplayer" index="0"] +[node name="main" type="VBoxContainer" parent="content/wrapper/starter/multiplayer" index="0"] +layout_mode = 2 + +[node name="title" type="Label" parent="content/wrapper/starter/multiplayer/main" index="0"] layout_mode = 2 size_flags_horizontal = 4 text = "多人游戏" label_settings = SubResource("LabelSettings_lfxcn") -[node name="host" type="HBoxContainer" parent="content/wrapper/starter/multiplayer" index="1"] +[node name="connectionState" type="Label" parent="content/wrapper/starter/multiplayer/main" index="1"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 4 +text = "状态:" +label_settings = SubResource("LabelSettings_kl3ko") + +[node name="host" type="HBoxContainer" parent="content/wrapper/starter/multiplayer/main" index="2"] layout_mode = 2 alignment = 1 -[node name="tip" type="Label" parent="content/wrapper/starter/multiplayer/host" index="0"] +[node name="tip" type="Label" parent="content/wrapper/starter/multiplayer/main/host" index="0"] layout_mode = 2 text = "地址" label_settings = SubResource("LabelSettings_sdsu8") -[node name="hostInput" type="LineEdit" parent="content/wrapper/starter/multiplayer/host" index="1"] +[node name="hostInput" type="LineEdit" parent="content/wrapper/starter/multiplayer/main/host" index="1"] unique_name_in_owner = true layout_mode = 2 theme = ExtResource("4_lfxcn") @@ -97,13 +111,14 @@ placeholder_text = "主机" expand_to_text_length = true emoji_menu_enabled = false virtual_keyboard_type = 7 +clear_button_enabled = true select_all_on_focus = true -[node name="separator" type="Label" parent="content/wrapper/starter/multiplayer/host" index="2"] +[node name="separator" type="Label" parent="content/wrapper/starter/multiplayer/main/host" index="2"] layout_mode = 2 text = ":" -[node name="portInput" type="LineEdit" parent="content/wrapper/starter/multiplayer/host" index="3"] +[node name="portInput" type="LineEdit" parent="content/wrapper/starter/multiplayer/main/host" index="3"] unique_name_in_owner = true layout_mode = 2 theme = ExtResource("4_lfxcn") @@ -114,18 +129,48 @@ emoji_menu_enabled = false virtual_keyboard_type = 2 select_all_on_focus = true -[node name="operation" type="HBoxContainer" parent="content/wrapper/starter/multiplayer" index="2"] +[node name="operation" type="HBoxContainer" parent="content/wrapper/starter/multiplayer/main" index="3"] layout_mode = 2 alignment = 1 -[node name="launchBtn" type="Button" parent="content/wrapper/starter/multiplayer/operation" index="0"] +[node name="launchBtn" type="Button" parent="content/wrapper/starter/multiplayer/main/operation" index="0"] unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 4 text = "启动服务器" -[node name="connectBtn" type="Button" parent="content/wrapper/starter/multiplayer/operation" index="1"] +[node name="connectBtn" type="Button" parent="content/wrapper/starter/multiplayer/main/operation" index="1"] unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 4 text = "连接服务器" + +[node name="serverConfig" type="VBoxContainer" parent="content/wrapper/starter/multiplayer" index="1"] +layout_mode = 2 +alignment = 1 + +[node name="title" type="Label" parent="content/wrapper/starter/multiplayer/serverConfig" index="0"] +layout_mode = 2 +size_flags_horizontal = 4 +text = "服务器配置" + +[node name="maxPlayer" type="HBoxContainer" parent="content/wrapper/starter/multiplayer/serverConfig" index="1"] +layout_mode = 2 +alignment = 1 + +[node name="title" type="Label" parent="content/wrapper/starter/multiplayer/serverConfig/maxPlayer" index="0"] +layout_mode = 2 +size_flags_horizontal = 4 +text = "最大玩家数" +label_settings = SubResource("LabelSettings_i7qv0") + +[node name="maxPlayerInput" type="LineEdit" parent="content/wrapper/starter/multiplayer/serverConfig/maxPlayer" index="1"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 4 +theme = ExtResource("4_lfxcn") +text = "10" +expand_to_text_length = true +emoji_menu_enabled = false +virtual_keyboard_type = 2 +select_all_on_focus = true diff --git a/scripts/Contents/Panels/Starter.gd b/scripts/Contents/Panels/Starter.gd index f305558..0acc7e2 100644 --- a/scripts/Contents/Panels/Starter.gd +++ b/scripts/Contents/Panels/Starter.gd @@ -4,6 +4,12 @@ extends FullscreenPanelBase @onready var diffEdit: HSlider = $"%diffEdit" @onready var startBtn: Button = $"%startBtn" @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" func _ready(): diffEdit.min_value = GameRule.difficultyRange.x @@ -13,6 +19,20 @@ func _ready(): Wave.next() UIState.closeCurrentPanel() ) + maxPlayerInput.text_changed.connect( + func(text): + MultiplayerState.maxPlayer = int(text) + ) + launchBtn.pressed.connect( + func(): + MultiplayerState.launchServer(int(portInput.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 = MultiplayerState.stateTextMap[state] + connectionState.modulate = MultiplayerState.stateColorMap[state] diff --git a/scripts/Statemachine/FullscreenPanelBase.gd b/scripts/Statemachine/FullscreenPanelBase.gd index 06ad47b..380913a 100644 --- a/scripts/Statemachine/FullscreenPanelBase.gd +++ b/scripts/Statemachine/FullscreenPanelBase.gd @@ -15,9 +15,6 @@ func showPanel(args: Array = []): animator.play("show") await animator.animation_finished -func _ready(): - visible = false - # 钩子 func beforeOpen(_args: Array = []): pass diff --git a/scripts/Tools/Managers/MultiplayerState.gd b/scripts/Tools/Managers/MultiplayerState.gd new file mode 100644 index 0000000..f53e470 --- /dev/null +++ b/scripts/Tools/Managers/MultiplayerState.gd @@ -0,0 +1,31 @@ +class_name MultiplayerState + +enum ConnectionState { + DISCONNECTED, + CONNECTING, + CONNECTED_HOST, + CONNECTED_CLIENT, +} +static var stateTextMap = { + ConnectionState.DISCONNECTED: "未连接到服务器。", + ConnectionState.CONNECTING: "连接中...", + ConnectionState.CONNECTED_HOST: "服务器启动成功!", + ConnectionState.CONNECTED_CLIENT: "已连接到服务器!", +} +static var stateColorMap = { + ConnectionState.DISCONNECTED: Color.RED, + ConnectionState.CONNECTING: Color.YELLOW, + ConnectionState.CONNECTED_HOST: Color.GREEN, + ConnectionState.CONNECTED_CLIENT: Color.GREEN, +} + +static var state: ConnectionState = ConnectionState.DISCONNECTED +static var isMultiplayer: bool = false + +static var maxPlayer: int = 10 + +static func launchServer(port: int): + isMultiplayer = true + var peer = ENetMultiplayerPeer.new() + peer.create_server(port, maxPlayer) + return peer diff --git a/scripts/Tools/Managers/MultiplayerState.gd.uid b/scripts/Tools/Managers/MultiplayerState.gd.uid new file mode 100644 index 0000000..842eb8e --- /dev/null +++ b/scripts/Tools/Managers/MultiplayerState.gd.uid @@ -0,0 +1 @@ +uid://ec6qkbh82cf