2201_76015305 2024-05-18 17:48 采纳率: 33.3%
浏览 8

如何实现多个godot游戏房间,实现加入一个房间。之前加入的退出

godot创建三个房间(HBoxContainer)。每个房间下都有一个标签(Label)0/1和一个按钮(Button)。点击按钮可以把让0/2变成1/2。

现在需要实现这个操作,下面每个都是对应的房间:
点击第一个房间按钮后
1/2 加入
0/2 加入
0/2 加入

点击第二个房间按钮后
0/2 加入
1/2 加入
0/2 加入

点击第三个房间按钮后
0/2 加入
0/2 加入
1/2 加入

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-18 17:48
    关注

    引自免费微信小程序:皆我百晓生

    为了实现这个功能,你需要在Godot中编写一些脚本。首先,为每个房间创建一个新的Node2D类,并将其命名为Room. 在这个类中,我们将添加两个属性:一个用于存储房间中的玩家数量(一个整数变量),另一个用于表示房间状态的标签(一个Label节点)。然后,我们将创建一个方法来处理按钮点击事件,更新房间状态并广播给所有连接的客户端。这里是一个详细的步骤:

    1. 创建Room类:
      • 打开Godot编辑器。
      • 在项目浏览器中右键点击root节点,选择Create > Node > Custom Node,并命名为Room.
      • 双击打开新创建的Room.gd文件,在其中编写以下代码:
    class_name Room extends Node2D
    
    var player_count: int = 0 // 存储房间内的玩家数量
    var label: Label # 标签显示玩家/最大人数
    
    # 初始化函数
    func _ready():
        # 设置标签文本
        update_label()
    
    # 更新标签文本的方法
    func update_label():
        label.text = "#{player_count}/2" # 假设每个房间最多容纳2人
    
    # 处理按钮点击事件的方法
    func on_button_clicked():
        player_count += 1
        if player_count > 2:
            player_count = 2 # 确保不超过最大人数
        update_label()
        broadcast_room_state() # 广播新的房间状态
    
    1. Room节点添加到场景中:

      • 在场景中创建3个HBoxContainer,分别代表3个房间。
      • 对于每个HBoxContainer,为其添加一个Room节点作为子节点。
      • 为每个Room节点设置其标签和按钮。
      • 为每个按钮分配on_button_clicked方法。
    2. 实现广播房间状态:

      • 在你的主场景中,创建一个新的Node2D类,例如GameController, 这将负责处理所有房间的状态同步。
      • 编写一个方法来接收并处理来自各个房间的广播消息。
      • 为每个Room节点设置GameController作为其父节点,并通过上帝模式传递消息。

    以下是GameController.gd的代码示例:

    class_name GameController extends Node2D
    
    # 定义一个数组来保存所有的Room实例
    var rooms: Array<Room>
    
    # 初始化函数
    func _ready():
        # 获取场景中的所有Room节点
        var room_nodes := get_node_list("Room")
        for node in room_nodes:
            rooms.append(node.as(Room))
    
        # 注册信号监听器
        for room in rooms:
            room.connect("room_state_changed", self, "on_room_state_changed")
    
    # 接收房间状态改变的回调函数
    func on_room_state_changed(room: Room):
        # 根据传入的room对象,更新对应房间的标签
        var index = rooms.index(room)
        rooms[index].get_parent().find_node("Label").text = room.label.text
    
    1. 最后,将Roombroadcast_room_state()方法修改为发送一个自定义信号,以便在GameController中接收:
    # Room.gd 文件
    signal room_state_changed(room: Room)
    
    # ... (其他代码保持不变)
    
    func broadcast_room_state():
        emit_signal("room_state_changed", self)
    

    这样,当用户点击任意一个房间的按钮时,会触发on_button_clicked方法,增加房间内的玩家数量,并广播新的房间状态。GameController会接收到这个信号,并根据接收到的信息更新所有房间的标签。注意,这只是一个基本的实现,实际应用可能还需要考虑网络同步、多用户交互等问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 5月18日
  • 创建了问题 5月18日