Swift Sprite套件碰撞位掩码

时间:2016-01-11 15:18:20

标签: swift sprite-kit collision-detection collision bitmask

我想知道是否有人能够在使用3个节点时为我提供一些帮助,我知道如果我只有2个节点,例如。身体A和身体B,但我在努力增加第三个身体,我希望它像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(播放器)行。那么当玩家接触敌人1或2时,如何调整代码以使两种不同的结果发生。

由于

1 个答案:

答案 0 :(得分:0)

您不了解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,所以你必须自己测试它。