让我们通过制作 RPG 来学习 Godot 4 — 第 13 部分:敌人死亡时掉落战利品
我们终于可以射击并杀死敌人了,但我们可以做得更好。我希望我们升级敌人的死亡功能,以便我们的敌人掉落我们可以捡起的战利品。这种战利品掉落的几率为 90%,并且战利品将从我们的 Pickups 枚举中随机抽取。这意味着我们的敌人可能会掉落弹药、健康饮料或耐力饮料。
您将在本部分中学习到的内容:
· 如何随机化百分比和枚举返回值。
在 damage() 函数的死亡条件中,我们需要使用随机方法来随机化战利品变化百分比。如果值小于 0.9(90%),我们将随机化一个拾取物。这个拾取物也将根据我们拥有的枚举值数量(即 3)进行随机化。然后,这个拾取物将被添加到我们的场景中,并在我们被杀死的敌人的位置生成。
### Enemy.gd
extends Area2D
# older code
#will damage the enemy when they get hit
func hit(damage):
health -= damage
if health > 0:
#damage
animation_player.play("damage")
else:
#death
#stop movement
timer_node.stop()
direction = Vector2.ZERO
#stop health regeneration
set_process(false)
#trigger animation finished signal
is_attacking = true
#Finally, we play the death animation and emit the signal for the spawner.
animation_sprite.play("death")
death.emit()
#drop loot randomly at a 90% chance
if rng.randf() < 0.9:
var pickup = Global.pickups_scene.instantiate()
pickup.item = rng.randi() % 3 #we have three pickups in our enum
get_tree().root.get_node("Main/PickupSpawner/SpawnedPickups").call_deferred("add_child", pickup)
pickup.position = position
什么是 call_deffered?
call_deferred是一种允许您将另一个方法的调用推迟到当前帧或周期结束时的方法。这在您想要更改场景树或其他对象但又不希望这些更改在当前函数或信号期间立即生效的情况下特别有用。
如果你现在运行场景并杀死敌人,他们掉落战利品的几率应该为 90%。你可以根据需要将此值降低到 50% 或 60% — 根据你对敌人死亡时掉落战利品的概率的偏好进行设置。
现在我们的敌人会掉落战利品,我们不必不断寻找拾取物。在下一部分中,我们将为我们的敌人添加功能,使其能够向我们的玩家射击并伤害我们。记得保存您的项目,下一部分见。