【问题标题】:Swift Spritekit physicsBodies do collision bit masks in the SKScene editorSwift Spritekit PhysicsBodies 在 SKScene 编辑器中做碰撞位掩码
【发布时间】:2018-01-13 18:20:50
【问题描述】:

我有两个球。我不希望它们相互碰撞。我希望它们与其他一切发生碰撞。我使两个球具有不同的类别位掩码 2 和 3。所有其他对象具有相同的类别位掩码 1。我尝试将两个球的碰撞位掩码设置为 1。我还读到了一些说对碰撞位掩码和类别位掩码进行操作,如果它非零则存在碰撞,所以我让球具有碰撞位掩码作为另一个的类别位掩码。因此它们将为 0,而其他一切都将是非零并发生碰撞。这些都不起作用,所以我该如何制作它们才能按照我想要的方式工作。

这些是我尝试过的一些面具

【问题讨论】:

    标签: swift game-physics skphysicsbody


    【解决方案1】:

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

    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 和 ball2Category 添加到所有物理体碰撞位掩码中,除了对面的球和与这些物理体发生碰撞但彼此不发生碰撞的球。

    【讨论】:

    • 有没有办法在 skscene 编辑器中分配在代码中创建的类别位掩码,因为我有许多对象,我不想检索所有对象以在代码中添加类别位掩码
    • @JoeBob123 在 sks 中创建一个节点并在代码中获取它以充当模型(当您需要另一个实例时克隆它)。例如,观察模板“游戏”使用“标签”和“旋转节点”的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多