- 出道即巅峰,先做个盈利千万的小项目
- 新建 Godot 项目
- Godot 界面介绍
- FlappyBird:1.Hello World
- FlappyBird:2.坠落吧,小鸟
- FlappyBird:3.在哪坠落就在哪飞起来
- FlappyBird:4. 无限地面
- FlappyBird:4.1 无限地面之 Godot 青年 (AnimationPlayer) 版
- FlappyBird:4.2 无限地面之普通青年版
- FlappyBird:4.3 无限地面之文艺青年(shader) 版
- FlappyBird:5.1 无尽水管子滚滚来(一)
- Godot Engine:5 种碰撞体以及 RigidBody 的 4 种模式
- Godot Engine:碰撞和碰撞检测的简单实例(RigidBody2D 与 Area2D 碰撞)
- Godot Engine:碰撞和碰撞检测的简单实例(RigidBody2D 与 StaticBody2D 碰撞)
- FlappyBird:5.2 无尽水管子滚滚来(二)
- Godot Engine:Timer 节点使用范例
- FlappyBird:6 来点 MUSIC(音效系统)
- Godot Engine:用自动加载(AutoLoad) 实现单例模式(Singleton Pattern)
- FlappyBird:7 心里有数(计分系统)
- Godot Engine:本地数据存取的帮助类(加密/非加密)
- FlappyBird:8 让数据说话(显示分数)
- Godot Engine:如何使用外部字体和 Label 节点制作一个计时器
- FlappyBird:9.1 天下没有不 OVER 的 GAME(上)
- Godot Engine:两行代码实现观察者模式(Observer Pattern),就问你服不服?
- FlappyBird:9.2 天下没有不 OVER 的 GAME(下)
- FlappyBird:10 大不了从头再来(新局启动)
- Godot Engine:用 Call Method Track(方法回调轨道)实现动画回调
- FlappyBird:11 番外篇:罗永浩都抖音了,要不咱们也抖一抖?(屏幕震动)
- Godot Engine:屏幕振动效果的实现
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
FlappyBird:5.1 无尽水管子滚滚来(一)
本章节效果图
步骤
制作 Pipe.tscn
- 按照下图的样子,在场景树上新建一棵子树(红框中的内容),“Pipe”是一个
Node2D
,其它节点的名称或前缀即代表其类型
关于 Godot 的碰撞和碰撞检测的使用,请看这几篇文章:
《Godot Engine:5 种碰撞体以及 RigidBody 的 4 种模式》
《Godot Engine:碰撞和碰撞检测的简单实例(RigidBody2D 与 Area2D 碰撞)》
《Godot Engine:碰撞和碰撞检测的简单实例(RigidBody2D 与 StaticBody2D 碰撞)》
在"Pipe"上添加一个名为"Pipe.gd"的脚本
#Pipe.gd
extends Node2D
func _process(delta):
position += Vector2.LEFT*200.0*delta
运行一下场景
“穿越”一下试试
新建一个名为"Objects"的文件夹
在节点"Pipe"上右键, 将分支保存为场景
有人问到底什么是场景?场景就是保存成文件并且可以重复利用的节点树
把场景保存到新建的"Objects"文件夹中
这时你会发现,原来的节点树“缩成”了一个节点,旁边多了一个场景标识,代表这个节点对应着一个场景
把刚才保存的"Pipe.tscn"文件拖拽到场景里几个,然后运行试试
看!可以重复利用!
PipeManager
我们取得阶段性胜利了,但是不能高兴太早,说好的“无尽水管子滚滚来”,要是每个“水管子”都是这么拖上来的,那么每个 FlappyBird 背后都会有一个累死的程序员。所以我们需要动态的实例化柱子。
继续搭建场景,把刚才拖到场景中的柱子都删掉,像下面这样创建子树(红框中内容),“PipeManager”是一个 Timer
关于 Timer
节点的使用请看这篇文章 《Godot Engine:Timer 节点使用范例》
设置一下 Timer
的参数,详见 《Godot Engine:Timer 节点使用范例》
然后在"PipeManager"节点上添加一个脚本"PipeManager.gd"
#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)#将实例化的结果作为自身的子节点
运行一下
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论