Godot4.3类星露谷游戏开发之【昼夜循环】

千里之行,始于足下

零、 笔记

为了让游戏可以拥有白天和黑夜,我们需要像上帝一样,在游戏中创造时间的规则,并在不同的时间点产生不同的颜色。

一、创造时间

第一步,在 res://脚本/全局脚本/ 路径 下,新建脚本 时间管理器.gd

时间管理器.gd
第二步,在项目设置 > 全局 下,添加该脚本为单例,并命名为 TimeManager

TimeManager
第三步,更新 时间管理器.gd 脚本代码 ;

extends Node
## 时间管理 

signal 游戏总时间更新(: float)
signal 游戏格式化时间更新(格式化时间: Array[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 = 1000.0
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 结果

二、产生颜色

第一步,以 昼夜循环组件(CanvasModulate) 为根节点,在 res://场景/组件/ 路径下,创建新场景;

昼夜循环组件
第二步,选中 昼夜循环组件 节点,附加脚本;

class_name 昼夜循环组件
extends CanvasModulate

@export var 昼夜渐变纹理: GradientTexture1D


func _ready() -> void:
	TimeManager.游戏总时间更新.connect(昼夜更替)
	
	
func 昼夜更替(: float) ->void:
	var 每日秒数: int = 24 * 60 * 60
	
	# 从正弦函数中获取在 0和1 之间来回变动的采样值:y = 1/2(sin2πx + 1),y ∈ [0,1]
	var 采样值: float = sin(/ 每日秒数 * 2 * PI - (0.5 * PI) ) * 0.5 + 0.5
	
	# 根据采样值产生纹理变化,形成昼夜更替的效果
	color = 昼夜渐变纹理.gradient.sample(采样值)  # 昼夜渐变纹理
	#print("采样值:", 采样值)

第三步,选中 昼夜循环组件 节点,在检查器中新建 GradientTexture1D

新建GradientTexture1D
第四步,在展开的Gradient中设置 栅格吸附 的值为 12 ,从左到右代表从晚上0点到中午12点,从右到左代表从中午12点到晚上0点

栅格吸附
第五步,开始设置各个时间点的颜色,这里设置 0时、1时、3时、5时、6时、12时 作为示范——鼠标左(右)键点击色卡可以创建(撤销)颜色;

0时、1时、3时、5时、6时、12时
第六步,分别双击各个柱体,在弹出的色盘中设置颜色,完全根据个人喜好来,这里0时是海蓝色,1时是浅蓝色,3时时天青色,5时是橘红色,6时是淡黄色,12点是白色;

双击各个柱体

三、搭建测试环境

第一步,将 测试_基本地形 场景复制为 测试_昼夜循环 ,并更改根节点名为 测试_昼夜循环

测试_昼夜循环1
测试_昼夜循环2

第二步,在测试_昼夜循环场景中,实例化 昼夜循环组件

实例化昼夜循环组件

四、测试

打开 测试_昼夜循环 场景,运行场景,测试昼夜循环效果;

测试昼夜循环效果
测试完成!

五、免费开源资产包

某开源网站精灵图资源包链接: 点击此处

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ForBigData

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值