本系列是根据老师的教程做的, 中间遇到些小问题, 于是把自己做的过程记录下来, 便于下次查看, 如有错误, 欢迎批评指正, 附上老师的原地址: 开发游戏的老王
本节效果
添加障碍物
- 添加如下节点,可以按节点名称来搜_Up和_Down是复制的时候加的后缀
- 养成习惯,改一下节点名称
- 把管子的图片放进来,并调整一下大小和位置
- 添加碰撞体(消除警告⚠),添加上后图形表面会覆盖一层淡蓝色的矩形
- 把整个Pipe移动到小鸟的前面,再添加一个移动的脚本试试
extends Node2D
func _ready():
position.y += randf()*300-150 #Y轴随机偏移量的范围(-150,150)
func _process(delta):
position += Vector2.LEFT*200.0*delta #每隔一段时间向左移动一下
if position.x < 0:
queue_free() #当柱子超出范围,释放节点(从游戏中删除,避免占用资源)
- 运行一下,效果大概是这样
添加很多障碍物
- 将分支保存为场景,大概相当于Unity的预制体,每次直接把预制体拿出来用就行,不用像上面一样一步步添加一个障碍物
有人问到底什么是场景?场景就是保存成文件并且可以重复利用的节点树
- 把场景保存到Objects文件夹内,方便下次使用,这时候会发现原本的节点树变成孤零零的一个节点了,旁边多了一个场景标识
- 把Pipe.tscn拖拽几个到场景里面, 运行试试, 注意几个Pipe是并列的关系
自动添加障碍物
要是每个“水管子”都是这么拖上来的,那么每个FlappyBird背后都会有一个累死的程序员。所以我们需要动态的实例化柱子。
- 先把之前Game场景里的的Pipe删掉, 然后在Game下创建一个Timer节点,改名为PipeManager
- 看一下Timer的参数
属性 | 说明 |
---|---|
Process Mode | Idle表示在_process中更新;Physics表示在_physics_process中更新 |
One Shot | 是否是一次性的 |
Wait Time | 间隔时间,单位是秒 |
Auto Start | 是否自动启动 |
- 在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)#将实例化的结果作为自身的子节点
实例化场景官方文档 上面代码不理解可以点进去看看
- 运行一下, 发现所有的管子都在一个高度上, 不合理
管子随机高度
- 打开Pipe.gd的脚本, 添加两行代码就行, 就是在水管准备(ready)生成的时候给一个随机高度
func _ready():
position.y += randf()*300-150 #Y轴随机偏移量的范围(-150,150)