mirror of
https://github.com/Rundll86/Dog-Lynx-And-HCN.git
synced 2026-06-30 15:22:30 +08:00
feat(多人游戏): 添加多人游戏状态管理和服务器配置功能
- 新增 MultiplayerState 类管理连接状态和服务器操作 - 在 Starter 面板中添加服务器配置和状态显示 - 实现服务器启动和最大玩家数设置功能
This commit is contained in:
@@ -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="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"]
|
[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
|
font_size = 20
|
||||||
outline_size = 1
|
outline_size = 1
|
||||||
|
|
||||||
|
[sub_resource type="LabelSettings" id="LabelSettings_kl3ko"]
|
||||||
|
font_size = 14
|
||||||
|
|
||||||
[sub_resource type="LabelSettings" id="LabelSettings_sdsu8"]
|
[sub_resource type="LabelSettings" id="LabelSettings_sdsu8"]
|
||||||
font_size = 12
|
font_size = 12
|
||||||
outline_size = 1
|
outline_size = 1
|
||||||
|
|
||||||
|
[sub_resource type="LabelSettings" id="LabelSettings_i7qv0"]
|
||||||
|
font_size = 13
|
||||||
|
|
||||||
[node name="Starter" instance=ExtResource("1_o0yse")]
|
[node name="Starter" instance=ExtResource("1_o0yse")]
|
||||||
offset_top = 0.0
|
offset_top = 0.0
|
||||||
offset_bottom = 0.0
|
offset_bottom = 0.0
|
||||||
@@ -52,14 +58,12 @@ unique_name_in_owner = true
|
|||||||
custom_minimum_size = Vector2(100, 0)
|
custom_minimum_size = Vector2(100, 0)
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
size_flags_vertical = 4
|
size_flags_vertical = 4
|
||||||
min_value = -5.0
|
max_value = 0.0
|
||||||
max_value = 5.0
|
|
||||||
value = 1.0
|
|
||||||
|
|
||||||
[node name="levelShow" type="Label" parent="content/wrapper/starter/singleplayer/diffs" index="2"]
|
[node name="levelShow" type="Label" parent="content/wrapper/starter/singleplayer/diffs" index="2"]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
text = "1 ∈ [-5, 5]"
|
text = "0 ∈ [0, 0]"
|
||||||
|
|
||||||
[node name="startBtn" type="Button" parent="content/wrapper/starter/singleplayer" index="1"]
|
[node name="startBtn" type="Button" parent="content/wrapper/starter/singleplayer" index="1"]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
@@ -70,25 +74,35 @@ text = "单人游戏"
|
|||||||
|
|
||||||
[node name="multiplayer" type="VBoxContainer" parent="content/wrapper/starter" index="1"]
|
[node name="multiplayer" type="VBoxContainer" parent="content/wrapper/starter" index="1"]
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
theme_override_constants/separation = 5
|
theme_override_constants/separation = 15
|
||||||
alignment = 1
|
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
|
layout_mode = 2
|
||||||
size_flags_horizontal = 4
|
size_flags_horizontal = 4
|
||||||
text = "多人游戏"
|
text = "多人游戏"
|
||||||
label_settings = SubResource("LabelSettings_lfxcn")
|
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
|
layout_mode = 2
|
||||||
alignment = 1
|
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
|
layout_mode = 2
|
||||||
text = "地址"
|
text = "地址"
|
||||||
label_settings = SubResource("LabelSettings_sdsu8")
|
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
|
unique_name_in_owner = true
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
theme = ExtResource("4_lfxcn")
|
theme = ExtResource("4_lfxcn")
|
||||||
@@ -97,13 +111,14 @@ placeholder_text = "主机"
|
|||||||
expand_to_text_length = true
|
expand_to_text_length = true
|
||||||
emoji_menu_enabled = false
|
emoji_menu_enabled = false
|
||||||
virtual_keyboard_type = 7
|
virtual_keyboard_type = 7
|
||||||
|
clear_button_enabled = true
|
||||||
select_all_on_focus = 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
|
layout_mode = 2
|
||||||
text = ":"
|
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
|
unique_name_in_owner = true
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
theme = ExtResource("4_lfxcn")
|
theme = ExtResource("4_lfxcn")
|
||||||
@@ -114,18 +129,48 @@ emoji_menu_enabled = false
|
|||||||
virtual_keyboard_type = 2
|
virtual_keyboard_type = 2
|
||||||
select_all_on_focus = true
|
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
|
layout_mode = 2
|
||||||
alignment = 1
|
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
|
unique_name_in_owner = true
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
size_flags_horizontal = 4
|
size_flags_horizontal = 4
|
||||||
text = "启动服务器"
|
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
|
unique_name_in_owner = true
|
||||||
layout_mode = 2
|
layout_mode = 2
|
||||||
size_flags_horizontal = 4
|
size_flags_horizontal = 4
|
||||||
text = "连接服务器"
|
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
|
||||||
|
|||||||
@@ -4,6 +4,12 @@ extends FullscreenPanelBase
|
|||||||
@onready var diffEdit: HSlider = $"%diffEdit"
|
@onready var diffEdit: HSlider = $"%diffEdit"
|
||||||
@onready var startBtn: Button = $"%startBtn"
|
@onready var startBtn: Button = $"%startBtn"
|
||||||
@onready var levelShow: Label = $"%levelShow"
|
@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():
|
func _ready():
|
||||||
diffEdit.min_value = GameRule.difficultyRange.x
|
diffEdit.min_value = GameRule.difficultyRange.x
|
||||||
@@ -13,6 +19,20 @@ func _ready():
|
|||||||
Wave.next()
|
Wave.next()
|
||||||
UIState.closeCurrentPanel()
|
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):
|
func _physics_process(_delta):
|
||||||
levelShow.text = "%d ∈ [%d, %d]" % [diffEdit.value, diffEdit.min_value, diffEdit.max_value]
|
levelShow.text = "%d ∈ [%d, %d]" % [diffEdit.value, diffEdit.min_value, diffEdit.max_value]
|
||||||
GameRule.difficulty = diffEdit.value
|
GameRule.difficulty = diffEdit.value
|
||||||
|
|
||||||
|
func setState(state: MultiplayerState.ConnectionState):
|
||||||
|
MultiplayerState.state = state
|
||||||
|
connectionState.text = MultiplayerState.stateTextMap[state]
|
||||||
|
connectionState.modulate = MultiplayerState.stateColorMap[state]
|
||||||
|
|||||||
@@ -15,9 +15,6 @@ func showPanel(args: Array = []):
|
|||||||
animator.play("show")
|
animator.play("show")
|
||||||
await animator.animation_finished
|
await animator.animation_finished
|
||||||
|
|
||||||
func _ready():
|
|
||||||
visible = false
|
|
||||||
|
|
||||||
# 钩子
|
# 钩子
|
||||||
func beforeOpen(_args: Array = []):
|
func beforeOpen(_args: Array = []):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://ec6qkbh82cf
|
||||||
Reference in New Issue
Block a user