关于Flappy bird中水管与小鸟的碰撞
前言
在开发游戏的老王的文章5.1无尽水管滚滚来link中出现了三个碰撞体,浅谈一下我对三个碰撞体的看法。
提示:以下是本篇文章正文内容,下面案例可供参考
一、碰撞节点
在此只简单阐述RigidBody2D节点、Area2D节点和StaticBody2D节点。
关于RigidBody2D节点,该节点不由制作者自己支配,由物理引擎操控,可以向它施加外力来改变速度。例如在FlappyBird中,我们可以改变RigidBody2D节点中的Gravity Scale值从而达到让小鸟落下的更快的目的。
关于Area2D节点,该节点没有“形体”,可以理解为物体可以穿过它,就想一团气体一样,物体与他发生了碰撞但可以穿过它。例如FlappyBird中,小鸟每穿过一根水管就会得一分,实现得分方式就可以使用Area2D节点,RigidBody2D节点与它发生碰撞,系统会记录并给出反馈。
看雨StaticBody2D节点,该节点可以用作大型的墙面。例如FlappyBird中水管,以及地面,天花板都是用这个节点。
二、关于节点中心点
通俗来说可以理解为RigidBody2D节点(同理可以是Area2D节点,StaticBody2D节点)是整个物体的核心,Sprite是物体的灵魂,而CollisionShape是物体的身体,当核心灵魂身体三者重合,也就是RigidBody2D节点、Sprite节点以及CollisionShape节点重合时,才是一个完整物体。
让鼠标悬浮在节点可以看出该节点是什么节点。
着重说一下几个节点的中心点的问题。
注:最上方的pipe是一个Node2D节点
StaticBody2D up节点、StaticBody2D节点和Area2D scorearea节点是pipe(也就是Node2D节点)的子节点,那么移动Node2D节点的中心,它的所有子节点包括子节点的子节点都会跟着移动。
所以在我们做这种有很多子节点的工程时,应该最先调好最大的节点也就是父节点,然后一层一层的去调整剩下子节点的位置(可以利用Transform菜单里position中x,y的值进行细致的调节)。
这时候又有一个小技巧:父节点的中心,是它的子节点的原点以此建立平面直角坐标系。那么想要让CollisionShape2D节点和Sprite up节点的中心与StaticBody2D up 节点的中心重合,就可以改动position中x、y的值都为0,这样三个节点的中心就重合在一起了。
三、制作小鸟穿过水管的逻辑
现在我们的小鸟可以很自然的上下飞动,那怎么才能让它飞过水管呢?
首先我们要制作一个上下都有的水管,小鸟穿不过去水管而是会和水管发生碰撞,所以我们选择StaticBody2D节点来制作水管。
第二,小鸟成功飞过水管会得分,那么飞过水管这一动作需要得到反馈,我们可以使用没有“形体”的Area2D节点来当作反馈的装置。
第三,小鸟可能会飞的过高或者过低掉下去,这时候我们就要往天空和地面加上碰撞体让小鸟不会飞出显示区,这个碰撞节点就可以选择可以用作大型墙面的StaticBody2D节点。
还有后面无限的水管会用到timer节点,在此不多做阐述。
注:这些步骤会需要代码来进行功能的完善,代码部分可以参考最上方的链接)
以上都是自己的理解,如有错误还请大家指出。
感谢阅读