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();
    }
}

演示


目录
相关文章
|
3月前
|
人工智能 运维 安全
MCP协议深度解析:客户端-服务器架构的技术创新
作为一名长期关注AI技术发展的博主摘星,我深刻感受到了MCP(Model Context Protocol)协议在AI生态系统中的革命性意义。MCP协议作为Anthropic公司推出的开放标准,正在重新定义AI应用与外部系统的交互方式,其基于JSON-RPC 2.0的通信机制为构建可扩展、安全的AI应用提供了坚实的技术基础。在深入研究MCP协议规范的过程中,我发现这一协议不仅解决了传统AI应用在资源访问、工具调用和上下文管理方面的痛点,更通过其独特的三大核心概念——资源(Resources)、工具(Tools)、提示词(Prompts)——构建了一个完整的AI应用生态系统。MCP协议的客户端-
319 0
MCP协议深度解析:客户端-服务器架构的技术创新
|
3月前
|
自然语言处理 开发者 Python
Django 实战:I18N 国际化与本地化配置、翻译与切换一步到位
Django国际化与本地化指南,涵盖i18n和l10n的定义、配置、视图与模型中的翻译使用、消息文件生成与编译,以及多语言登录实战。助你打造多语言支持的Web应用。
134 0
|
4月前
|
SQL 分布式计算 Hadoop
别再云里雾里了!一文带你整明白Hadoop生态到底是啥玩意儿
别再云里雾里了!一文带你整明白Hadoop生态到底是啥玩意儿
179 0
|
3月前
|
机器学习/深度学习 算法 机器人
使用rrt随机决策树进行3d路径规划
使用rrt随机决策树进行3d路径规划
162 0
|
3月前
|
并行计算 机器人 网络安全
阿里云服务器上部署ROS2+Isaac-Sim4.5实现LeRobot机械臂操控
本文介绍了如何在阿里云上申请和配置一台GPU云服务器,并通过ROS2与Isaac Sim搭建机械臂仿真平台。内容涵盖服务器申请、系统配置、远程连接、环境搭建、仿真平台使用及ROS2操控程序的编写,帮助开发者快速部署机器人开发环境。
1014 4
|
3月前
|
人工智能 开发工具 数据库
Django实战:Python代码规范指南
PEP 8 是 Python 官方代码风格指南,提升代码可读性与团队协作效率。本文详解命名规范、注释写法、常用工具(如 Black、flake8)、编程实践与代码优化技巧,助力写出规范、易维护的 Python 代码。
156 7
|
3月前
|
人工智能 JavaScript 前端开发
Godot-创建一个3D棋盘
本教程介绍使用C#在Godot引擎中创建3D棋盘游戏。内容包括:下载Godot .NET版本、创建主场景和单元格场景、设置相机与碰撞检测、添加3D模型及材质,并通过C#脚本实现8x8黑白棋盘。附带完整代码示例和运行效果展示,适合初学者入门Godot 3D开发。
119 0
|
3月前
|
C#
Godot-放置棋子,实现黑白棋翻转
本教程介绍如何在Godot引擎中创建一个简单的黑白棋游戏,包含光照设置、棋子动画、点击交互及棋子翻转逻辑,并通过C#脚本实现游戏规则与场景效果展示。
88 0
|
3月前
|
供应链 JavaScript 前端开发
一个月内使用成品系统快速部署一套适合中小企业的ERP系统
本文介绍如何在一个月内快速部署适合中小企业的ERP系统,重点在于成品系统选型、核心业务流程标准化与模块化配置。方案涵盖系统架构、模块配置、极速上线流程、常见避坑指南及后续迭代建议,助力企业高效落地ERP系统。
|
9月前
|
NoSQL Java Redis
Jedis高版本的JedisPoolConfig没有maxActive和maxWait
在高版本的Jedis中,连接池配置属性发生了一些变化。通过使用 `JedisPoolConfig`中的新属性,可以更好地管理和优化Redis连接池。本指南提供了详细的配置方法和示例代码,帮助开发者快速上手并正确配置Jedis连接池。希望本文对您有所帮助,能够在项目中高效地使用Jedis与Redis。
260 14