Swift Sprite 套件碰撞位掩码

Swift Sprite kit Collision Bitmask

我想知道是否有人能够为我提供一些使用 3 个节点的帮助,我知道如果我只有 2 个节点,例如body A 和 body B 但我正在努力添加第三个 body,我希望它像 body C 一样简单,但事实并非如此。 这是下面的相关代码:

    struct CollisionCategoryBitmask {
    static let Player: UInt32 = 0x00
    static let Enemy1: UInt32 = 0x01
    static let Enemy2: UInt32 = 0x02
}



    func didBeginContact(contact: SKPhysicsContact) {

    var updateHud = false
    _ = (contact.bodyA.node != player) ? contact.bodyA.node : contact.bodyB.node
    updateHud = slowDown(player)
}

下面这个函数是为了在接触 Enemy1 时减慢玩家速度

 func slowDown (player: SKNode) -> Bool {

    player.physicsBody?.velocity = CGVector(dx: 0, dy: -50.0)
    return true

}

下面的这个是为了让游戏在接触 Enemy2 时结束

 func endGame (player: SKNode) -> Bool {

    endOfGame()
    return true
}

目前这两种功能都有效,但一次只能使用一种,所以当玩家接触到敌人 1 或 2 时。我现在可以让玩家放慢速度或让游戏结束,只需更改 updateHud = slowDown(player) 行。那么,当玩家触摸敌人 1 或 2 时,我该如何调整代码以产生两种不同的结果。

谢谢

您不了解 didBeginContact 的工作原理。基本上发生的事情是当任何 2 个节点进行联系时,系统要做的第一件事是确保类别和联系位掩码对齐以进行有效联系。如果是,则调用 didBeginContact。现在在这个函数中,你有 2 个任意节点进行接触,称为 bodyA 和 bodyB。您首先需要做的是弄清楚 bodyA 和 bodyB 是什么。所以你做的第一件事就是检查 categoryBitMask。

   if(contact.bodyA.categoryBitMask == HERO) then contact.bodyA is a hero

既然我们知道了这些节点指的是什么类别,那么我们就可以检查这些节点到底是什么了。为此,您可以检查节点的名称

  if(contact.bodyA.node.name == "Hero") then bodyA is the hero 

或者比较节点本身

  if(contact.bodyA.node == heroNode) then bodyA is the hero

现在对 bodyB 做同样的事情。

此时您已经确定了您的节点是什么,您可以根据这些信息继续处理您需要的结果。

如果Hero同时击中了两个敌方节点,那么你也需要处理这个问题。将要发生的是对 didBeginContact 的 2 次调用,您需要找到一种方法来记住这一点,并在 didEvaluateActionsdidSimulatePhysicsMethod 中填写您的联系代码。我不记得didBeginContact后面是哪一个,所以你得自己测试一下。