👨‍💻 只是玩玩 | JUST FUN

Godot游戏引擎学习 第五课

可移动平台

今天终于开始做场景了,万丈高楼平地起,先跟着视频做一个可移动平台。

因为这种平台时可以复用的,所以我们基于Godot的引擎的对象思想在一个新的场景里构建移动平台,再实例化到主场景里,这样我们以后可以在其他场景里很方便的复用它。

  1. 新建一个场景,并添加一个Node2D父节点名为MovingPlatform
  2. 因为平台时有碰撞体,所以在父节点下添加一个KinematicBody2D节点,并开启Motion > Sync To Physic,物理计算和帧同步,避免出现延迟,人物悬浮在空中的情况。
  3. 然后在KinematicBody2D下添加Sprite节点拖入平台的图片素材
  4. 增加CollisionShape2D碰撞区域节点,并调整大小覆盖整个平台。
    image-20201223201837307

平台算是添加好了,今天终于要使用新的节点了:Path2DPathFollow2D,官方的文档里的解释:Contains a Curve2D path for PathFollow2D nodes to follow.,它可以在场景里绘制一个用于移动的曲线路径。不过这只是修好马路,我们还需要RemoteTransform2D这个节点可以指定一个节点对象更新它的position, rotation and/or scale.。对了,因为我们只想让平台上下移动,所以我们关掉PathFollow2D里的RotateLoop

image-20201223204558512

好了,我们现在有了车辆,有了马路,也加好油了,现在需要用老朋友AnimationPlayer来让画面动起来了。

  1. AnimationPlayer里新建一个default动画,长度设为4秒
  2. PathFollow2Dunit_offset添加一个起始关键帧,并设为0
  3. 并在第2秒插入第二个关键帧,把uni_offset设置为最大值,这样平台移动到一半的时候到达顶点,并在剩下的零秒重新归为最最小值。

然后保存场景,并在world主场景中实例化平台,运行游戏,就能看到上下移动的平台了。

然后是代码方面,现在存在一个问题,因为平台是有碰撞体的,如果角色站在平台下面会把角色压进地面里。而且在平台底下无法跳跃,所以做个改进。

打开CollisionShape2DOne Way Collis,官方文档的解释是:Sets whether this collision shape should only detect collision on one side (top or bottom).,意思是只检测某一个方向的碰撞,就会像上图哪里平台会有个箭头指向下方。(默认是下方不检测碰撞,不知道怎么修改。)

但是现在角色站在平台上会有一些抖动,所有跳跃的逻辑我们再修改一下,代码如下:

# 如果跳起来就是Vector2(0,0)下面那个函数再运算的时候就不会进行吸附
var snap = Vector2.ZERO if is_jumping else Vector2.DOWN * 16
# move_and_slide_with_snap,跳跃后让角色吸附在平台上。
velocity = move_and_slide_with_snap(velocity, snap, Vector2.UP)

但是我这里角色还是有一些抖动,我代码应该是写对了的。

另外有个没说了,我们可以通过Ctrl+d在主场景复制多个平台实例,但是会发现一个问题,我们选中任意一个平台节点右键选择子节点可编辑(比如这个平台我们想重新绘制移动路径,让平台斜着走),编辑其中内容后会发现其他所有的实例化的平台对象全都跟着变化了,我以前学过C#,对这个还算是了解,其实这些复制的所有节点都引用的同一个实例,像是投影出来的画面一样,你改了任意内容投影出来的其他画面也会耕者变化。所以我们可以把想单独修改的实例资源独立化,在属性界面点击这个小扳手,选择转为独立资源即可。:

image-20201223212146433

到这里算是完成了移动平台的实现。

因为时间还多,这里我就跟着看了后面的一集课程,这集课很简单的,UP主说了一个BUG,就是因为我们在实现吃金币那里并没有去判断谁能迟到金币,所以现在情况是只要是金币被碰撞,不管碰撞它的是谁,都能把金币吃掉。

所以UP解释了一个在游戏里层的概念。

用过PS或者CDR的朋友应该知道,一个画面是可以被另外一个画面遮盖住,但是这个在这些软件中不存在同一层的情况 ,只有我遮住你了,或者你遮住我了。不过在Godot里碰撞就是分层的,在同一层的东西才能互相交互。

我们打开金币场景,并选择父节点Area2D,可以在属性的Collision的子项里发现LayerMask,翻译过来就是画布层和遮罩层。

image-20201223213223599

这些小方块就是代表当前这个节点在碰撞层里所处的位置,当两个层的点有交集时就能互相碰撞。

这些层的名字默认都是Layer1,Layer2这样的命名,为了方便管理我们可以在项目管理里修改这些层的名字

image-20201223214251289

好了,最终如下:

第五课