Add multiplayer game mode over the network

This commit is contained in:
Squinternator 2024-04-07 21:03:56 +00:00
parent ecc195e38e
commit 35af9ecc2d
13 changed files with 278 additions and 81 deletions

View file

@ -1,8 +1,31 @@
[gd_scene load_steps=5 format=3 uid="uid://bjctlqvs33nqy"]
[gd_scene load_steps=6 format=3 uid="uid://bjctlqvs33nqy"]
[ext_resource type="Texture2D" uid="uid://c1tjamjm8qjog" path="res://interfaces/menus/boot/background.webp" id="1_ph586"]
[ext_resource type="PackedScene" uid="uid://1seg8cvss7a7" path="res://interfaces/menus/boot/multiplayer.tscn" id="2_lcb0h"]
[sub_resource type="GDScript" id="GDScript_jd8xf"]
resource_name = "MainMenu"
script/source = "extends CanvasLayer
class_name MainMenu
signal start_demo
signal start_server(peer)
signal join_server(peer)
func _ready():
$Multiplayer.start_server.connect(_on_start_server)
$Multiplayer.join_server.connect(_on_join_server)
func _on_demo_pressed():
start_demo.emit()
func _on_start_server(peer):
start_server.emit(peer)
func _on_join_server(peer):
join_server.emit(peer)
"
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_snh7i"]
bg_color = Color(0, 0.5, 0.5, 0.25)
@ -11,18 +34,6 @@ script/source = "extends PanelContainer
const PLAYER = preload(\"res://characters/player/player.tscn\")
const MAP = preload(\"res://maps/genesis/genesis.tscn\")
func _on_demo_pressed():
# instantiate scenes
var player = PLAYER.instantiate()
var map = MAP.instantiate()
# set player initial position
player.position = Vector3(0,150,0)
# add as siblings in tree
for o in [map, player]:
owner.add_sibling(o)
# queue main_menu node for deletion
owner.queue_free()
func _on_multiplayer_pressed():
hide()
@ -33,6 +44,7 @@ func _on_quit_pressed():
"
[node name="MainMenu" type="CanvasLayer"]
script = SubResource("GDScript_jd8xf")
[node name="TextureRect" type="TextureRect" parent="."]
anchors_preset = 15
@ -81,6 +93,6 @@ layout_mode = 2
theme_override_font_sizes/font_size = 32
text = "Quit"
[connection signal="pressed" from="Main/MarginContainer/VBoxContainer/Demo" to="Main" method="_on_demo_pressed"]
[connection signal="pressed" from="Main/MarginContainer/VBoxContainer/Demo" to="." method="_on_demo_pressed"]
[connection signal="pressed" from="Main/MarginContainer/VBoxContainer/Multiplayer" to="Main" method="_on_multiplayer_pressed"]
[connection signal="pressed" from="Main/MarginContainer/VBoxContainer/Quit" to="Main" method="_on_quit_pressed"]

View file

@ -13,6 +13,9 @@ const DEFAULT_HOST : String = \"localhost\"
var _join_address = RegEx.new()
var _registered_ports = RegEx.new()
signal start_server(peer)
signal join_server(peer)
func _ready():
# see https://datatracker.ietf.org/doc/html/rfc1700
_registered_ports.compile(r'^(?:102[4-9]|10[3-9]\\d|1[1-9]\\d{2}|[2-9]\\d{3}|[1-5]\\d{4}|6[0-4]\\d{3}|65[0-4]\\d{2}|655[0-2]\\d|6553[0-5])$')
@ -38,7 +41,8 @@ func _on_join_pressed():
# create client
var peer = ENetMultiplayerPeer.new()
peer.create_client(addr[0], addr[1])
multiplayer.multiplayer_peer = peer
join_server.emit(peer)
func _on_host_pressed():
var port = DEFAULT_PORT
@ -52,16 +56,11 @@ func _on_host_pressed():
push_warning(\"A valid port number in the range 1024-65535 is required.\")
return
# create server
## create server
var peer = ENetMultiplayerPeer.new()
peer.create_server(port, MAX_CLIENTS)
multiplayer.multiplayer_peer = peer
multiplayer.peer_connected.connect(_on_peer_connected)
func _on_peer_connected(peer_id):
print(\"Peer `%s` connected\" % peer_id)
start_server.emit(peer)
"
[node name="Multiplayer" type="PanelContainer"]