Swift Spritekit physicsBodies在SKScene编辑器中执行碰撞位掩码

时间:2018-01-13 18:20:51

标签: swift game-physics skphysicsbody

我有两个球。我不希望他们互相碰撞。我希望他们与其他一切发生冲突。我使两个球具有2和3的不同类别位掩码。所有其他对象具有相同类别的位掩码1.我已经尝试将两个球的碰撞位掩码设置为1.我还读了一些说的是对碰撞位掩码和类别位掩码进行操作,如果它非零,则发生碰撞,因此我将球的碰撞位掩码作为另一个的类别位掩码。所以他们将是0,其他一切都将是非零和碰撞。这些都不起作用,所以我如何实际制作它们以便它按我希望的方式工作。

enter image description here

enter image description here

这些是我试过的一些面具

1 个答案:

答案 0 :(得分:0)

在代码中执行它,它更容易阅读。

class GameScene: SKScene, SKPhysicsContactDelegate {

  weak var ball1: SKSpriteNode?
  weak var ball2: SKSpriteNode?

  let noCategory:UInt32 = 0
  let ball1Category:UInt32 = 0b1
  let ball2Category:UInt32 = 0b1 << 1
  let wall1Category:UInt32 = 0b1 << 2

  override func didMove(to view: SKView) {
      self.physicsWorld.contactDelegate = self
      ball1 = self.childNode(withName: "ball1") as? SKSpriteNode
      ball2 = self.childNode(withName: "ball2") as? SKSpriteNode
      wall1 = self.childNode(withName: "wall1") as? SKSpriteNode

      ball1?.physicsBody?.categoryBitMask = ball1Category
      ball1?.physicsBody?.collisionBitMask = noCategory

      ball2?.physicsBody?.categoryBitMask = ball2Category
      ball2?.physicsBody?.collisionBitMask = noCategory

      wall1?.physicsBody?.categoryBitMask = wall1Category
      wall1?.physicsBody?.collisionBitMask = ball1Category | ball2Category
  }
}

现在你可以很容易地看到wall1与ball1和ball2相撞,但是球本身并没有碰到任何东西。对于碰撞,只有一个物理实体需要设置碰撞位掩码。因此,您可以将ball1和ball2ategory添加到所有物理实体的碰撞比特掩模,除了相反的球和球与这些物理实体相撞而不是相互碰撞。