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

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

创建主菜单

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

结构如下

image.png

添加的两个按钮用于创建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个实例

image.png

第一步: 在第一个游戏实例中点击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事件

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容