今天继续完成之前指定的任务,基本上算是全部完成了

image-20201230232036706

今天完成了所有机关部分,分别为顶部尖刺,上下飞轮,弹簧垫。

其实所有的机关我应该做个父类的,自己偷懒了,没有去实践父脚本这个东西。不过好在也算是全部实现了,基本上没啥问题了。

顶部尖刺

利用Area2D场景来做碰撞检测,因为尖刺是图块形式,而且设置在场景中后是不规则的形状,所以碰撞检测节点不在使用CollisionShape2D了,这里使用的ColiisisonPolygon,这个节点可以通过点线来设置不规则的碰撞区域,用在这里刚刚好。

image-20201230232549435

上下飞轮

这里用到了之前学移动平台时候的知识,主要原理是利用了AnimationPlayer、Path2D、Path2dFollow、RemoteTransform2D这几个组件。RemoteTransform记录当前PathFollow2D的路径,并更新给Sprite,再利用AnimationPlayer来PathFollow2D的路径更新Sprite的位置,RemoteTransForm主要是同步的作用。

刚刚做的时候都忘记之前是怎么弄的了,仔细看了下RemoteTransForm文档里的介绍后才算是真正弄懂了这个节点的作用。

另外做动画的移动的关键帧只需要设置到一半,运行到一半后数值达到指定数据后剩下后面半解动画会自动跟着相减知道0为值,这样即可达到上下来回的目的。

image-20201230232927096

弹簧垫

利用Area2d检测body_entered信号,传入玩家的palyer对象,更改起跳数据即可。

这里的节点结构和其他机关不一样,应为弹簧垫是有碰撞体积的,所以我在Area2D下增加了一个StaticBody2D节点,这个节点下面再增加Sprite,animationPlayer等节点,这样实例化到场景里面后这个弹簧垫就有了碰撞体积。不至于人物踩在上面会重叠在一起。

代码实部分

# 身体进如碰撞区域的信号,并传入碰撞该物体的节点对象
func _on_TrapSpringPad_body_entered(player):
    # 只有在角色碰撞到的情况下才触发事件
	if player.get_name() == "Player":
        # 让玩家跳跃高度为正常跳跃的1.5倍高
		player.velocity.y = -player.jump_force * 1.5
        # 并播放弹簧垫的弹动动画
		animation_player.play("bounce")
        # 设置玩家状态为跳跃状态。
		player.is_jumping = true;

image-20201230233606547

最终效果

新场景_trap