Godot游戏练习01-第2节-创建主菜单

33 阅读2分钟

今天继续第一个游戏练习, 创建一个主菜单, 并将它设置为默认运行场景, 并创建基础的多人Host服务器和Client连接

创建主菜单

创建一个根节点为Control的main_menu.tscn场景

结构如下

添加的两个按钮用于创建Host服务器和Client客户端

将main_menu.tscn设置为项目默认场景: Project -> Project Settings -> Run -> Main Scene

绑定脚本

脚本处理按钮事件, 暂时只打印点击事件

extends Control

@onready var host_button: Button = %HostButton
@onready var join_button: Button = %JoinButton


func _ready() -> void:
	host_button.pressed.connect(_on_host_pressed)
	join_button.pressed.connect(_on_join_pressed)


func _on_host_pressed() -> void:
	print("host pressed")


func _on_join_pressed() -> void:
	print("join pressed")

基本的服务器和客户端创建

修改Host和Join按钮的逻辑, 使用Godot中提供的高级网络接口创建服务器和客户端

extends Control

const PORT : int = 34560

@onready var host_button: Button = %HostButton
@onready var join_button: Button = %JoinButton


func _ready() -> void:
	host_button.pressed.connect(_on_host_pressed)
	join_button.pressed.connect(_on_join_pressed)
	multiplayer.peer_connected.connect(_on_peer_connected)


func _on_host_pressed() -> void:
	var server_peer := ENetMultiplayerPeer.new()
	server_peer.create_server(PORT)
	multiplayer.multiplayer_peer = server_peer


func _on_join_pressed() -> void:
	var client_peer := ENetMultiplayerPeer.new()
	client_peer.create_client("127.0.0.1", PORT)
	multiplayer.multiplayer_peer = client_peer


func _on_peer_connected(id: int) -> void:
	print("my peer [%s] connected: %s" % [multiplayer.get_unique_id(), id])

Host和Client都监听多人接口的peer_connected信号, 在信号处理时同时打印当前peer的id, 以及新连入的peer id

观察多人连接时peer_connected的触发方式

先打开多客户端示例支持 Debug -> Customize ... -> Enable Multiple Instances, 设置为3

再次运行游戏, 会同时打开3个实例

第一步: 在第一个游戏实例中点击Host, 创建服务器, 无打印

第二步: 在第二个游戏实例窗口点击Client, 连接服务器, 发现Host和Client都出现了打印

my peer [1234621383] connected: 1
my peer [1] connected: 1234621383

第三步: 在第三个游戏实例窗口中点击Client, 再观察新增的打印内容

my peer [834066640] connected: 1
my peer [1] connected: 834066640
my peer [1234621383] connected: 834066640
my peer [834066640] connected: 1234621383

众所周知, Server的peer id为1, 根据打印结果可得知

当一个peer连接到服务器时, 该peer自身会收到来自每一个其余peer(包含服务器)的peer_connected事件, 而其余每一个peer(包括服务器)也都会收到来自该peer的peer_connected事件