Godot-游戏显示信息

简介: 本教程介绍如何创建一个游戏主界面和玩家信息显示系统。使用Godot引擎,设置开始场景包含游戏名称、难度选择和主菜单功能,并通过代码实现场景切换与难度设置。接着,创建玩家信息场景,利用SubViewport与UI元素显示对战双方信息、倒计时及当前回合。教程包含完整脚本与节点设置,适合初学者学习游戏界面设计与场景管理。

游戏主界面

创建场景StartScene.tscn作为游戏的开始界面,分别显示游戏名称,游戏难度,开始游戏,设置,退出游戏,点击开始游戏进入游戏主场景,进行游戏。

游戏脚本参考如下:

using Godot;
using Othello;
using System;
public partial class StartScene : Node2D
{
    private OptionButton difficultySelector;
    private Button startButton;
    private Button existButton;
    public override void _Ready()
    {
        difficultySelector = GetNode<OptionButton>("CanvasLayer/Control/CenterContainer/VBoxContainer/OptionButton");
        startButton = GetNode<Button>("CanvasLayer/Control/CenterContainer/VBoxContainer/Start");
        existButton = GetNode<Button>("CanvasLayer/Control/CenterContainer/VBoxContainer/Exist");
        startButton.Pressed += OnStartPressed;
        existButton.Pressed += OnExistPressed;
    }
    private void OnExistPressed()
    {
        GetTree().Quit();
    }
    private void OnStartPressed()
    {
        // 获取选择的难度
        int selected = difficultySelector.Selected;
        int depth = selected switch
        {
            0 => 1, // 简单
            1 => 3, // 普通
            2 => 5, // 困难
            _ => 2,
        };
        // 存入全局变量(推荐用 Autoload)
        GameSettings.AIDepth = depth;
        // 切换到主场景
        GetTree().ChangeSceneToFile("res://Main.tscn");
    }
}

创建游戏玩家信息

创建玩家信息场景PlayerInfo.tscn,使用SubViewPort作为根节点,以便能够嵌套入游戏主场景中。该场景分别显示对手信息,玩家信息,倒计时,当前回合,参考场景设置如下:

在主场景中创建PlayerInfoPanel(MeshInstance3D)用来承载游戏玩家信息显示,创建SubViewport一个实例化场景PlayerInfo。

PlayerInfoPanel→Mesh:PlaneMesh;

Mesh→Material:StandardMaterial3D;

StandardMaterial3D→Resource→Local to Scene 启用;

StandardMaterial3D→Albedo→Texture:ViewportTexture;

ViewportTexture→Viewport Path:PlayerInfo。

在Main.cs中实现游戏信息显示的逻辑,参考代码如下:

private Label opponentNameLabel;
private Label opponentCountLabel;
private Label playerNameLabel;
private Label playerCountLabel;
private Label countdownLabel;
private Label currentPlayerLabel;
private int countdownSeconds = 30;
private Timer countdownTimer;
/// <summary>
/// 初始化玩家信息
/// </summary>
private void InitPlayerInfo()
{
    // 获取 UI 面板节点
    var infoPanel = GetNode<MeshInstance3D>("PlayerInfoPanel");
    var playerInfo = GetNode<SubViewport>("PlayerInfo");
    opponentNameLabel = playerInfo.GetNode<Label>("Control/VBoxContainer/PanelOpponent/VBoxContainerOpponent/OpponentNameLabel");
    opponentCountLabel = playerInfo.GetNode<Label>("Control/VBoxContainer/PanelOpponent/VBoxContainerOpponent/OpponentCountLabel");
    playerNameLabel = playerInfo.GetNode<Label>("Control/VBoxContainer/PanelPlayer/VBoxContainerPlayer/PlayerNameLabel");
    playerCountLabel = playerInfo.GetNode<Label>("Control/VBoxContainer/PanelPlayer/VBoxContainerPlayer/PlayerCountLabel");
    countdownLabel = playerInfo.GetNode<Label>("Control/VBoxContainer/PanelDesc/VBoxContainerDesc/HBoxContainer/CountdownLabel");
    currentPlayerLabel = playerInfo.GetNode<Label>("Control/VBoxContainer/PanelDesc/VBoxContainerDesc/CurrentPlayerLabel");
    countdownTimer = new Timer();
    AddChild(countdownTimer);
    countdownTimer.WaitTime = 1.0f;
    countdownTimer.OneShot = false;
    countdownTimer.Timeout += OnCountdownTimeout;
    countdownTimer.Start();
    UpdatePlayerInfo();
    UpdateCountdownLabel();
}
private void UpdatePlayerInfo()
{
    opponentNameLabel.Text = "对手玩家: AI";
    opponentCountLabel.Text = "黑棋数: 12";
    playerNameLabel.Text = "我方玩家: 玩家";
    playerCountLabel.Text = "白棋数: 10";
    currentPlayerLabel.Text = currentPlayer == Piece.Black ? "黑方回合" : "白方回合";
}
private void UpdateCountdownLabel()
{
    countdownLabel.Text = $"倒计时: {countdownSeconds}s";
}
private void OnCountdownTimeout()
{
    countdownSeconds--;
    if (countdownSeconds <= 0)
    {
        //countdownTimer.Stop();
        countdownLabel.Text = "时间到!";
        // 触发超时逻辑,比如换对方走
        currentPlayer = currentPlayer == Piece.Black ? Piece.White : Piece.Black;
        countdownSeconds = 30;
        UpdatePlayerInfo();
    }
    else
    {
        UpdateCountdownLabel();
    }
}

演示


目录
相关文章
|
4月前
|
人工智能 运维 安全
MCP协议深度解析:客户端-服务器架构的技术创新
作为一名长期关注AI技术发展的博主摘星,我深刻感受到了MCP(Model Context Protocol)协议在AI生态系统中的革命性意义。MCP协议作为Anthropic公司推出的开放标准,正在重新定义AI应用与外部系统的交互方式,其基于JSON-RPC 2.0的通信机制为构建可扩展、安全的AI应用提供了坚实的技术基础。在深入研究MCP协议规范的过程中,我发现这一协议不仅解决了传统AI应用在资源访问、工具调用和上下文管理方面的痛点,更通过其独特的三大核心概念——资源(Resources)、工具(Tools)、提示词(Prompts)——构建了一个完整的AI应用生态系统。MCP协议的客户端-
433 0
MCP协议深度解析:客户端-服务器架构的技术创新
|
4月前
|
机器学习/深度学习 算法 机器人
使用rrt随机决策树进行3d路径规划
使用rrt随机决策树进行3d路径规划
258 0
|
4月前
|
并行计算 机器人 网络安全
阿里云服务器上部署ROS2+Isaac-Sim4.5实现LeRobot机械臂操控
本文介绍了如何在阿里云上申请和配置一台GPU云服务器,并通过ROS2与Isaac Sim搭建机械臂仿真平台。内容涵盖服务器申请、系统配置、远程连接、环境搭建、仿真平台使用及ROS2操控程序的编写,帮助开发者快速部署机器人开发环境。
1714 4
|
4月前
|
人工智能 JavaScript 前端开发
Godot-创建一个3D棋盘
本教程介绍使用C#在Godot引擎中创建3D棋盘游戏。内容包括:下载Godot .NET版本、创建主场景和单元格场景、设置相机与碰撞检测、添加3D模型及材质,并通过C#脚本实现8x8黑白棋盘。附带完整代码示例和运行效果展示,适合初学者入门Godot 3D开发。
186 0
|
4月前
|
C#
Godot-放置棋子,实现黑白棋翻转
本教程介绍如何在Godot引擎中创建一个简单的黑白棋游戏,包含光照设置、棋子动画、点击交互及棋子翻转逻辑,并通过C#脚本实现游戏规则与场景效果展示。
141 0
|
4月前
|
供应链 JavaScript 前端开发
一个月内使用成品系统快速部署一套适合中小企业的ERP系统
本文介绍如何在一个月内快速部署适合中小企业的ERP系统,重点在于成品系统选型、核心业务流程标准化与模块化配置。方案涵盖系统架构、模块配置、极速上线流程、常见避坑指南及后续迭代建议,助力企业高效落地ERP系统。
169 0
|
9月前
|
前端开发 Java 测试技术
语音app系统软件源码开发搭建新手启蒙篇
在移动互联网时代,语音App已成为生活和工作的重要工具。本文为新手开发者提供语音App系统软件源码开发的启蒙指南,涵盖需求分析、技术选型、界面设计、编码实现、测试部署等关键环节。通过明确需求、选择合适的技术框架、优化用户体验、严格测试及持续维护更新,帮助开发者掌握开发流程,快速搭建功能完善的语音App。
STM32CubeMX WS2812B灯驱动
STM32CubeMX WS2812B灯驱动
1165 1
|
数据安全/隐私保护
基于AutoJs实现的薅羊毛App专业版源码大分享---更新啦
基于AutoJs实现的薅羊毛App专业版源码大分享---更新啦
384 0

热门文章

最新文章