当前位置: 首页 > web >正文

Godot4.3类星露谷游戏开发之【时钟UI】

千里之行,始于足下

文章目录

  • 零、 笔记
  • 一、UI界面
  • 二、脚本
  • 三、搭建测试环境
  • 四、测试
  • 五、免费开源资产包

零、 笔记

本文将制作这个系列里的第一个UI(User Interface,用户界面)——时钟UI,如下图所示;

在这里插入图片描述

一、UI界面

时钟面板 时钟面板 时钟面板
第一步,在 res://场景/UI/ 路径 下,创建 时钟UI.tscn 场景;

在这里插入图片描述

节点树如下:

  • 时钟UI(Control)
    • 时钟面板(PanelContainer)
      • 昼夜图标1(Sprite2D)
      • 昼夜图标2(Sprite2D)
    • 当前时间(Label)

第二步,选中 时钟面板 节点,在检查器中 新建Theme 并另存为 游戏UI主题.tres 到路径 res://资源/主题/ 下;

在这里插入图片描述
在这里插入图片描述
第三步,在展开的主题底栏中点击【+】,添加项目类型 ClockUI

在这里插入图片描述
在这里插入图片描述
第四步,添加基础类型 PanelContainer

在这里插入图片描述
第五步,在panel下新建 StyleBoxTexture 并选中,随后在检查器中新建 AtlasTexture

在这里插入图片描述
在这里插入图片描述
第六步,从文末 UI包 导入 Weather_UI_Free.png,并 编辑区域

在这里插入图片描述
在这里插入图片描述
第七步,观察到裁剪后图片尺寸为 65x54像素

在这里插入图片描述
第八步,选中时钟面板节点,在检查器中更改 size65x54 ,更改 Type VariationClockUI

在这里插入图片描述
在这里插入图片描述
效果如下;

在这里插入图片描述


昼夜图标 1 (左) 昼夜图标1(左) 昼夜图标1(左)
第一步,选中昼夜图标(Sprite2D)节点,直接将 UI包 中的 Weather_Icons_smal_freel.png拖入检查器中的 Texture

在这里插入图片描述
第二步,点开检查器中的 Animation ,并设置 Hframes2Vframes3

在这里插入图片描述
第三步,手动将图标拖入时钟UI中,如下图;

在这里插入图片描述


昼夜图标 2 (右) 昼夜图标2(右) 昼夜图标2(右)
第一步,选中昼夜图标(Sprite2D)节点,在检查器中新建 AtlasTexture

在这里插入图片描述

第二步,从文末 UI包 中导入 Weather_UI_Free.png,并 编辑区域

在这里插入图片描述
在这里插入图片描述
第三步,手动将图标拖入时钟UI中,如下图;

在这里插入图片描述


当前时间 当前时间 当前时间

第一步,选中 当前时间 节点,加载 游戏UI主题.tres 主题;

在这里插入图片描述
第二步,在展开的主题底栏中,点击【+】按钮,添加项目类型 CurrentTime
在这里插入图片描述
在这里插入图片描述
第三步,设置基础类型为 Label ,字体大小 font_size16 ,字体为 UI包 中的 pixelFont-7-8x14-sproutLands.ttf

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第四步,调整 当前时间 节点至合适的位置;

在这里插入图片描述
第五步,以 游戏UI(CanvasLayer) 为根节点,新建场景 游戏ui.tscn ,并保存在 res://场景/UI/ 路径下;

在这里插入图片描述
第六步,添加 MarginContainer 为子节点,并实例化 时钟UI 为其子节点;

在这里插入图片描述
节点树如下:

  • 游戏UI
    • MarginContainer
      • 时钟UI

第七步,选中MarginContainer节点,在检查器中调整参数如下;
锚点预设 右上 ,尺寸大小为 70x59 ——时钟UI长宽各自增加 5

在这里插入图片描述
上外边距(Margin Top)、右外边距(Margin Right)设置为 5

在这里插入图片描述
此时运行游戏UI场景,时钟UI应该与 右边框上边框 各自有5个像素的距离;

在这里插入图片描述

二、脚本

第一步,选中 时钟UI 节点,附加脚本;

extends Control
## 时钟UI面板,00:00 -> 23:59 循环更替
## 6点 太阳
## 18点 月亮@onready var 当前时间: Label = $"当前时间"
@onready var 昼夜图标1: Sprite2D = $"时钟面板/昼夜图标1"func _ready() -> void:TimeManager.游戏格式化时间更新.connect(时间更新)func 时间更新(时间: Array[int]) ->void:当前时间.text = "%02d:%02d" % [时间[1], 时间[2]]# 更新昼夜图标if 时间[1] == 18:昼夜图标1.frame = 2  # 夜晚 elif 时间[1] == 6:昼夜图标1.frame = 0  # 白天

第二步,创建 时间管理器 单例,前文 Godot4.3类星露谷游戏开发之【昼夜循环】中已经实现;

extends Node
## 时间管理 signal 游戏总时间更新(: float)
signal 游戏格式化时间更新(:int,: int,: int,: int)const 每日秒数: int = 24 * 60 * 60
const 每时秒数: int = 60 * 60
const 每分秒数: int = 60
const 时间单元: Array[Array] = [[每日秒数, "天"],[每时秒数, "小时"],[每分秒数, "分钟"],[1, "秒"],
]# 初始游戏时间,第1天6:00:00
var 初始游戏天数: int = 1
var 初始游戏小时数: int = 6
var 初始游戏分钟数: int = 0
var 初始游戏秒数: int = 0# 累计游戏时间
var 累计游戏时间: float = 0.0# 其他设置
var 时间流速: float = 7000.0  # 相当于正常时间流速的5000倍
var 时间暂停: bool = false# 初始化累计游戏时间
func _ready() -> void:累计游戏时间 = 计算初始总秒数()# 产生时间
func _process(delta: float) -> void:if 时间暂停:return累计游戏时间 += delta * 时间流速#print_debug("累计游戏时间:", 累计游戏时间)# 发送时间信号游戏总时间更新.emit(累计游戏时间)# 转换格式并发送时间信号var 格式化时间: Array[int] = 转换时间格式(int(累计游戏时间))游戏格式化时间更新.emit(格式化时间)# 计算初始时间总秒数
func 计算初始总秒数() ->float:return (初始游戏天数 * 每日秒数 +初始游戏小时数 * 每时秒数 +初始游戏分钟数 * 每分秒数 +初始游戏秒数)# 格式转换:总秒数 -> 日/时/分/秒
func 转换时间格式(总秒数: int) ->Array[int]:# 异常处理if 总秒数 < 0:push_error("无效的时间参数")return [0, 0, 0, 0]# 格式转换var 剩余秒数 = int(总秒数)var 结果:Array[int] = []for 单元 in 时间单元:var 值 = 剩余秒数 / 单元[0]剩余秒数 %= 单元[0]结果.append()print_debug(结果)	return 结果

三、搭建测试环境

在前文 Godot4.3类星露谷游戏开发之【昼夜循环】创建的 测试_昼夜循环 场景中 ,实例化 游戏UI 场景为节点 ;

在这里插入图片描述

四、测试

运行 测试_昼夜循环 场景,测试时钟UI走动效果;

请添加图片描述
测试完成!

五、免费开源资产包

精灵包链接:点击此处
UI包链接:点击此处

  1. 进入链接后点击下图按钮;
    下载

  2. 然后点击【No thanks,just take me to the downloads】(不了谢谢,只想下载);
    No thanks,just take me to the downloads

  3. 最后点击下图按钮完成下载(注意导入前需解压缩)。
    下载

http://www.xdnf.cn/news/5266.html

相关文章:

  • 5大B2B数字营销社群营销标杆案例TOB企业数字化营销内容营销AI营销培训讲师培训师专家顾问唐兴通分享
  • JavaScript基础-局部作用域
  • FHE与后量子密码学
  • 昇腾NPU容器内 apt 换源
  • hot100-子串-JS
  • torch.nn.init.uniform_
  • C 语言数据结构基石:一维数组的定义、访问与使用详解
  • MYSQL中的RR隔离级别实现原理,它是如何解决不可重复读
  • [sklearn机器学习概述]机器学习-part3
  • Dify使用总结
  • Android平台FFmpeg音视频开发深度指南
  • yarn npm pnpm
  • Flink 系列之十二 - Data Stream API的输出算子
  • cursor sign in 网页登录成功,sursor软件里一直登陆不成功没有登陆信息
  • 【LeetCode 热题 100】215. 数组中的第K个最大元素(Python 快速选择详解)
  • 高精度加减
  • 普通IT的股票交易成长史--股价起伏的真相-缺口(2)
  • 2010-2020年 分省工业品月度产量数据-社科数据
  • 分析AMD业绩突飞猛进的原因
  • [ctfshow web入门] web71
  • SpringBoot项目容器化进行部署,meven的docker插件远程构建docker镜像
  • gvm安装go报错ERROR: Failed to use installed version
  • Linux进程信号的捕捉处理方式
  • 【Java学习】枚举(匿名类详解)
  • 基于大模型的新型隐球菌脑膜炎智能诊疗全流程系统设计与实现的技术方案文档
  • CD37.【C++ Dev】string类的模拟实现(上)
  • fastmcp: 更好用的 MCP Python 框架
  • SlideLoss与FocalLoss在YOLOv8分类损失中的应用及性能分析
  • 指针运算典型例题解析
  • IOC和Bean