我正在制作一款太空入侵者风格的游戏,并且希望让敌人必须被击中三下才能爆炸。
我使用的教程仅展示了如何让敌人在一次击中后爆炸。它使用一个名为 didBegin(_ contact: SKPhysicsContact)
https://www.youtube.com/watch?v=F0kcw6eryJs&t=617s
现在,根据我的理解,这个函数会评估每个接触实例,为两个实体分配两个不同的角色,然后决定如何处理每个实体。我假设让敌人受到三击,将使用包含其剩余生命值的变量。然后,每发生一次接触,变量就会减一,直到为零,敌人就会被移除。
然而,这里面有一个深层次的问题。由于didBegin(_ contact: SKPhysicsContact)
仅评估一个接触实例,因此它不知道其他先前的接触实例。本质上,当敌人被击中时,无法知道敌人是否之前被击中,根本没有被击中,或者已经被击中太多次。如果只有一个敌人,那么我可以使用一个变量来跟踪其健康状况。但事实并非如此,因为屏幕上同时有多个敌人,每次接触时,都无法知道之前的攻击是针对这个敌人还是另一个敌人。
如果屏幕上有一个敌人,这很简单,因为每次接触时都必须是那个敌人。但如果屏幕上有多个实体,则无法知道接触适用于哪个敌人。
我相信这需要对每个敌人实例进行某种识别,尽管我不确定如何做到这一点。对于那些阅读本文的人,我非常感谢您的光临,如果您能提供帮助,我将非常感激。
最佳答案
无需保留单独的字典来跟踪 Sprite 的状态
每个SKNode都有userData
,你可以用它追踪敌人的生命
示例:
let invader = SKSpriteNode(imageNamed:"invader")
invader.userData = ["health":3]
...
func didBeginContact(...)
{
...
//when a contact happens
contact.body_.node.userData["health"] -= 1
...
}
现在请记住,1 颗子弹可以击中 1 个敌人两次。您不想在这里触发 2 次生命损失,因此您需要有一个临时变量(您也可以将其保存在 userData 中)来让您知道特定的子弹是否已经与入侵者接触。
关于swift - 敌人受到多重伤害 - Swift、Xcode 8.2.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50714024/