前言
在上一个 part 中已经完成了大部分的逻辑,现在进行一些新的修改。
增加重力
首先将 PlayerDeath 中的 AnimationPlayer 设置为自动播放。
返回 PlayerDeath.gd 并增加一个重力 300,防止玩家的尸体腾空运动。
var gravity = 1000 |
_process 函数中更新 y 坐标:
extends KinematicBody2D | |
var velocity = Vector2.ZERO | |
var gravity = 1000 | |
func _process(delta): | |
velocity.y += gravity * delta | |
velocity = move_and_slide(velocity, Vector2.UP) # 第二个参数告诉移动函数地面法向量向上 | |
if (is_on_floor()): | |
velocity.x = lerp(0, velocity.x, pow(2, -1 * delta)) # 通过线性插值让速度变化更加平滑 |
需要注意的是,这里修改了 pow 中的差值,使之更加平滑了一些,之前的 - 10 有些过于强烈了。
防止玩家重复死亡
到了这里,如果你运行游戏并踩上两个尖刺,你会发现游戏报错了,原因是两个尖刺都会调用玩家 kill() 函数,但是在第一次死亡后玩家已经被删除,这是就会访问空实例。
解决方案如下 (增加一个布尔型判断玩家是否已经死亡,如果已经死亡就直接返回不再调用):
var isDying = false | |
func kill(): | |
if (isDying): | |
return | |
isDying = true | |
var playerDeathInstance = playerDeathScene.instance() | |
get_parent().add_child_below_node(self, playerDeathInstance) | |
playerDeathInstance.global_position = global_position | |
playerDeathInstance.velocity = velocity | |
emit_signal("died") |
使相机跟随玩家的尸体
当玩家死后,相机会停留在原地,我们希望相机跟随玩家的尸体一起滑动。
首先将 PlayerDeath 加入 “player_death” 分组,
然后回到 GameCamera 场景进行修改:
func acquire_target_position(): | |
var acquire = get_target_position_from_node_group("player") | |
if (!acquire): | |
get_target_position_from_node_group("player_death") | |
func get_target_position_from_node_group(groupName): | |
var target_group = get_tree().get_nodes_in_group(groupName) | |
if target_group.size() > 0: | |
var target = target_group[0] | |
global_position = target.global_position | |
# 如果能找到玩家返回设置相机的跟随位置 true,否则返回 false | |
return true | |
return false |
增加了一个可以复用的函数,可以直接返回需要找的目标组是否有孩子,如果有就设置为对应的全局坐标返回真值,如果没有就返回假值。
调用函数,如果找不到玩家组中的玩家结点,就直接去寻找死亡玩家组中的玩家尸体。
然后运行发现如果多次死亡,相机只会停留在死亡玩家组中第一个尸体(因为数组下标为 0 )的位置。
结语
剩余部分将不会放在本一节进行讲解,而是会放在一个单独的 part3 博客中,并且下一 part 将会加入粒子效果来掩盖玩家的死亡。