swift - 敌人受到多重伤害 - Swift、Xcode 8.2.1

标签 swift sprite-kit game-physics

我正在制作一款太空入侵者风格的游戏,并且希望让敌人必须被击中三下才能爆炸。

我使用的教程仅展示了如何让敌人在一次击中后爆炸。它使用一个名为 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/

相关文章:

c++ - 射线平面相交 : inaccurate results - rounding errors?

ios - SpriteKit Physics 的神秘因子 150。重力和力量

python - 石头,布,剪刀,蜥蜴,spock游戏在gui python中

swift - Swift 3 中有什么方法可以更新 Dictionary 键值并在一次操作中获取先前的值吗?

Swift po 导致错误 'Failed to load linked library Metal'

ios - 在 .onAppear 中切换动画时 SwiftUI 出现意外动画(使用 GeometryReader 的大小)

swift - Assets 单例和引用循环

ios - iOS 10 中 setValue 后 CIFilter 未更新

objective-c - Swift 中的方法名称

ios - 我怎样才能重新启动 SKScene?