【问题标题】:SKPhysicsBody avoid collision Swift/SpriteKitSKPhysicsBody 避免碰撞 Swift/SpriteKit
【发布时间】:2015-03-05 19:16:06
【问题描述】:

我的场景中有 3 个 SKSpriteNode。一只、一个硬币和一个边框围绕着场景。我不希望 coinbird 相互碰撞,但要在 border 内。 我为每个节点分配了不同的 collisionBitMask 和 categoryBitMask:

enum CollisionType:UInt32{
    case Bird  = 1
    case Coin = 2
    case Border = 3 
}

像这样:

bird.physicsBody!.categoryBitMask = CollisionType.Bird.rawValue
bird.physicsBody!.collisionBitMask = CollisionType.Border.rawValue

coin.physicsBody!.categoryBitMask = CollisionType.Coin.rawValue
coin.physicsBody!.collisionBitMask = CollisionType.Border.rawValue

但是硬币仍然相互碰撞。 我做错了什么?

【问题讨论】:

    标签: swift sprite-kit physics


    【解决方案1】:

    位掩码为 32 位。像你一样声明它们对应于:

    enum CollisionType:UInt32{
        case Bird = 1 // 00000000000000000000000000000001
        case Coin = 2 // 00000000000000000000000000000010
        case Border = 3 // 00000000000000000000000000000011
    }
    

    你想要做的是将你的边框值设置为 4。为了有以下位掩码:

    enum CollisionType:UInt32{
        case Bird = 1 // 00000000000000000000000000000001
        case Coin = 2 // 00000000000000000000000000000010
        case Border = 4 // 00000000000000000000000000000100
    }
    

    请记住,对于下一个位掩码,您必须遵循相同的操作:8、16、... 等等。

    编辑:

    此外,您可能希望使用结构而不是枚举并使用另一种语法来使其更容易(这不是强制性的,只是一个偏好问题):

    struct PhysicsCategory {
        static let None       : UInt32 = 0
        static let All        : UInt32 = UInt32.max
        static let Bird       : UInt32 = 0b1       // 1
        static let Coin       : UInt32 = 0b10      // 2
        static let Border     : UInt32 = 0b100     // 4
    }
    

    你可以这样使用:

    bird.physicsBody!.categoryBitMask = PhysicsCategory.Bird
    bird.physicsBody!.collisionBitMask = PhysicsCategory.Border
    
    coin.physicsBody!.categoryBitMask = PhysicsCategory.Coin
    coin.physicsBody!.collisionBitMask = PhysicsCategory.Border
    

    【讨论】:

    • 非常感谢!我是这个话题的新手。您能否给我一些链接或关键字,我可以在其中找到有关“UInt32 = 0b100”之类的更多信息?
    • 不客气。语法是“位移”,也许苹果文档(goo.gl/DXVBJD)太复杂而无法开始。但是,基本思想是初始位 (1) 表示为:00000000000000000000000000000001。如果您将其从一位移位,使用此语法0b10 或此语法0x1 << 1,该位向左移动一位:000000000000000000000000000000000。您可以使用0b1000x1 << 2 等将其从两个位置转移... :)
    • 那么,如果我需要另一个 PhysicsCategory,我可以 static let Board : UInt32 = 0b1000 // 8 对吗?
    • 对不起,我正在回答其他问题并试图为您制作一张桌子。所以这些是位,如果需要,在互联网上搜索它们。但是要回答您的问题:是的,您会这样做。这是我为您制作的表格,它可能会帮助您更好地理解:goo.gl/Qmnr6a
    • 哇!!男人们,你们真棒!!!非常感谢你的工作。因为你的表,我现在明白了位移的原理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多