Godot Timer节点

本文介绍了Godot中的Timer节点,将其与其他编程语言中的Timer进行了对比,并详细解析了在FlappyBird游戏中如何利用Timer实现水管的重复生成,强调了WaitTime和AutoStart属性的调整对游戏设计的影响。通过附带的脚本内容,展示了如何实例化和重复水管场景,以增加游戏趣味性。同时,文章提供了相关教程链接供读者深入学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

博客的参考资料,是来自 开发游戏的老王5.2 无尽水管子滚滚来(二)的Godot Engine:TImer节点使用范例

导言:Timer节点是什么呢?刚开始模仿制作的时候,看它对应的节点形状像一个时光沙漏,跟时间肯定有着什么千丝万缕的关系,它在Godot中有着什么特殊的含义吗。


1.Timer——在其他语言中的含义

那么提到Timer中的特殊含义,就又不得不提它在其他地方的表现。

其实Timer不光在Godot中起着重要的作用,在其他的编程语言中,也都或多或少有着它的身影。

其中在Java程序设计中,更为常见。

遇到所需要按时间计划执行简单任务的情况下,Timer是最常被使用到的工具类。使用Timer可以来调度TimerTask的实现者来实现任务,有两种方式,一种是使得任务在指定时间被执行一次,另一种是从某一指定时间开始周期性的执行任务。它其实就像是闹钟一样,固定我们去做某件事情,或者在某段固定的时间去做某件重复的事情。


2.Timer——在Godot的含义

在Godot中的TImer呢?我们来先上图。

在这里插入图片描述

其实在图片中,我们看得出官方对它的定义是倒数计时器。

Timer在Godot中的含义,其实就是接近等同于我们对Java它的理解,但是Java和Godot在Timer的使用中还是有着不一样之处的。(毕竟Java和Godot有着区别。)


3.常用调整

在这里插入图片描述

Timer节点中,其中最较为常用的是Wait Time与Auto Start。

从字面上理解:
Wait Time:是等候时间的长度,
Auto Start:是自动开启的选择

可以通过调整其对应的Timer节点中Wait time的数值调整和Auto Start的是否启用,可对我们所需要重复做的事件进行更改。

这便是对应需要调整的位置。

在这里插入图片描述


4.实际分析Timer节点在FlappyBird中的游戏设计理念

重温经典FlappyBird

在玩过游戏之后,我们分析一下实际游戏设计情况中。从而我们得知,水管是需重复及其间隔一定时间出现,游戏才拥有一定的趣味性。

若一只小鸟只遇见一个水管,便轻松越过,游戏永远不会停止,但游戏已经丧失了我们希望的乐趣。

理念:所以在此之前,先做好一个普通的水管,并将它做为整体重复的目标。让这个水管作为一个实例,将此水管设置为一个固定的场景,这样,只需要重复该场景,便可让水管无限重复,可做到游戏所需要的趣味性。


5.在FlappyBird中的游戏设计操作

那么便在Game.tscn中新建一个Timer节点,利用脚本,使得其场景重复。

在这里插入图片描述

Timer可以随意起名字,为了方便。我们这里按照开发游戏的老王的教程中,将Timer的节点名称改名为PipeManager,然后添加对应的教程脚本。

这里注意,,脚本中的路径与实际路径是否一致,要不然会出现代码报错的问题!!!

在这里插入图片描述

大家可以根据所需要的重复条件,可以调整水管出现的重复间隔时间,以及对自动开启的选项。

在这里插入图片描述

具体的操作内容,可参考【手把手带你Godot游戏开发】FlappyBird:5.1 无尽水管子滚滚来(一)的Godot教程。


6.附脚本内容

这是水管重复出现的脚本代码内容

#PipeManager.gd
extends Timer
var pipe_scn = preload("res://Objects/Pipe.tscn")#将要实例化的场景文件预加载进来

func _ready():
	connect("timeout",self,"on_timeout")#将"timeout"信号连接到"on_timeout"方法
	
func on_timeout():
	var pipe = pipe_scn.instance()#实例化
	add_child(pipe)#将实例化的结果作为自身的子节点

具体以上的代码讲解,在GDScript 代码笔记(一)


在此欢迎各位批评指正,

也再次感谢 开发游戏的老王的Godot教程。

你的点赞是我更新的动力~

<think>嗯,用户问的是在Visual Studio的Timer中,用new创建新对象是否会覆盖之前的值。首先,我需要明确用户具体指的是哪种Timer,因为C#里有System.Windows.Forms.Timer、System.Timers.Timer和System.Threading.Timer这几种常见的类型。不同的Timer可能在行为上有所不同,所以需要分别讨论。 接下来,用户提到使用new关键字创建新对象。这时候,我需要考虑对象的创建和旧对象的关系。在C#中,当使用new时,会实例化一个新的对象,旧的对象如果没有被引用的话,会被垃圾回收器处理。但是Timer对象如果还在运行,可能会导致旧实例继续存在,从而引发资源泄露或者事件重复触发的问题。 比如,假设用户有一个Timer变量,原先已经实例化并启动了。如果再次执行timer = new Timer(),这时候旧的Timer实例如果没有被Stop(),它的Elapsed事件可能仍然在触发,这样就会有两个Timer同时运行,造成不可预料的结果。所以需要强调在替换Timer实例前,先停止旧的Timer。 另外,还要提醒用户注意事件订阅的问题。如果旧的Timer订阅了Elapsed事件,而新实例没有重新订阅,那么旧的委托可能仍然关联到旧实例,导致内存泄露。这时候需要先取消旧的事件订阅,再创建新实例并重新订阅。 可能用户在实际开发中遇到了Timer事件被多次触发,或者资源没有正确释放的情况,所以才会提出这个问题。需要给出具体的代码示例,说明正确的做法,比如先Stop(),再Dispose(),再重新new,并重新设置属性和事件处理程序。 还需要考虑不同Timer类型之间的差异。例如,System.Windows.Forms.Timer是基于消息循环的,而System.Timers.Timer是基于线程池的。它们的Stop()方法和资源释放可能有所不同,需要分别说明。 最后,总结关键点:是否覆盖取决于是否取消旧实例的订阅和停止其运行。正确的做法是停止旧Timer,释放资源,再创建新实例,避免旧实例继续运行导致问题。同时,提醒用户使用using语句或手动Dispose()来确保资源释放,避免内存泄露。</think>在 C# 中,使用 `new` 创建新的 `Timer` 对象时是否会覆盖原有值,取决于具体场景和代码实现。以下是关键分析: ### 1. 对象覆盖机制 - **新建对象不会自动释放旧实例** 当执行 `timer = new Timer(...)` 时,旧 `Timer` 对象不会自动销毁,只是变量引用了新对象。旧实例如果没有其他引用,将由垃圾回收器(GC)处理,但**若旧定时器仍在运行,会继续触发事件**。 - **必须显式释放资源** 建议在替换前调用旧实例的 `Stop()` 和 `Dispose()` 方法: ```csharp oldTimer.Stop(); oldTimer.Dispose(); timer = new Timer(...); // 创建新实例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

柠檬茶12138

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

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

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

打赏作者

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

抵扣说明:

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

余额充值