【问题标题】:Swift Sprite kit Collision BitmaskSwift Sprite 套件碰撞位掩码
【发布时间】:2016-04-15 23:06:52
【问题描述】:

我想知道是否有人可以为我提供使用 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(player) 行。那么如何调整代码以在玩家接触敌人 1 或 2 时产生两种不同的结果。

谢谢

【问题讨论】:

  • static let Player: UInt32 = 0x00 无效,您是说玩家与任何人发生碰撞。位掩码的工作方式是您有 32 个“开关”(或标志),您可以打开或关闭每个开关。如果玩家打开了开关 1,那么敌人应该寻找所有打开了开关 1 的玩家,如果敌人找到了,就说他们发生了碰撞

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


【解决方案1】:

您不了解 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 做同样的事情。

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

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

【讨论】:

  • 您好,抱歉,我花了一段时间才回复。感谢您的建议,我对碰撞位掩码的工作原理进行了更多研究,并调整了我的代码,使其现在可以工作。谢谢
猜你喜欢
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
相关资源
最近更新 更多