【问题标题】:Prevent overlap between two SKPhysicBody's of the same type防止两个相同类型的 SKPhysicBody 重叠
【发布时间】:2018-11-13 15:20:59
【问题描述】:

我有一个游戏,其中两个球应该能够穿过作为终点线的第三个对象。两个球是SKShapeNodes,终点线是SKSpriteNode。它们都附有SKPhysicBodys,类别设置如下:

struct PhysicsCategory {
    static let ball: UInt32 = 0x1 << 1
    static let line: UInt32 = 0x1 << 2
}


ball.physicsBody = SKPhysicsBody(circleOfRadius: ballSize)
ball.physicsBody?.categoryBitMask = PhysicsCategory.ball
ball.physicsBody?.contactTestBitMask = PhysicsCategory.line
ball.physicsBody!.collisionBitMask = 1

line.physicsBody = SKPhysicsBody(rectangleOf: line.size)
line.physicsBody?.isDynamic = false
line.physicsBody?.categoryBitMask = PhysicsCategory.line
line.physicsBody?.contactTestBitMask = PhysicsCategory.ball
line.physicsBody!.collisionBitMask = 1

由于我希望球能够在不发生碰撞的情况下越过终点线,同时仍然能够收到有关此问题的通知,因此我将球和线的 collisionBitMask 设置为相同的值。

这给了我正在寻找的结果。然而,这似乎有一个副作用,即两个球也能够相互穿过,这是不应该发生的。

另外,如果我将collisionBitMask 的值设置为1 以外的任何值,球和线会相互碰撞。我已经阅读了 Apple 的相关文档,但我认为我在这里误解/遗漏了一些东西。

我的猜测是,因为两个球都认为对方拥有相同的collisionBitMask。重叠的发生是意料之中的。我不明白如何避免这种情况,而不必为每个球添加单独的类别。

谁能指出我正确的方向?如何让球通过终点线,同时又不能相互重叠?

【问题讨论】:

    标签: swift sprite-kit skphysicsbody


    【解决方案1】:

    我经常把这件事弄混,但希望我没记错。

    如果您只关心在主要由contactTestBitMask 控制的线上将碰撞回调返回到您所拥有的球。这就是将联系人发送到委托方法的原因。 collisionBitMask 控制实际控制物理计算的内容,即相互反弹的内容。

    默认情况下,collisionBitMask 将与所有内容发生冲突,因此您只想指定您希望它计算物理的内容。您将所有内容设置为 1,这在您的场景中没有任何具体内容。这就是为什么一切都通过彼此。我相信 2 会是球,而 4 与您提供的内容一致(如果您打印出 PhysicsCategory.ball 和 PhysicsCategory.line 这就是它注销的内容)。通常,最佳实践是使用您创建的枚举或结构,而不是指定数字。话虽如此,我倾向于无所事事地使用 0。

    要解决此问题,您需要告诉您的球您希望它们与 PhysicsCategory.ball 碰撞,并且您希望您的线与任何物体不发生碰撞,因此您希望将其设置为 0。

    struct PhysicsCategory {
        static let ball: UInt32 = 0x1 << 1
        static let line: UInt32 = 0x1 << 2
    }
    
    
    ball.physicsBody = SKPhysicsBody(circleOfRadius: ballSize)
    ball.physicsBody?.categoryBitMask = PhysicsCategory.ball
    ball.physicsBody?.contactTestBitMask = PhysicsCategory.line
    ball.physicsBody!.collisionBitMask = PhysicsCategory.ball //changed to ball
    
    line.physicsBody = SKPhysicsBody(rectangleOf: line.size)
    line.physicsBody?.isDynamic = false
    line.physicsBody?.categoryBitMask = PhysicsCategory.line
    line.physicsBody?.contactTestBitMask = PhysicsCategory.ball
    line.physicsBody!.collisionBitMask = 0 //you want no physics calculations
    

    【讨论】:

      猜你喜欢
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多