Swift Uint32将所有偶数识别为相同

时间:2016-02-19 03:45:39

标签: swift sprite-kit

我在Swift中使用SpriteKit并遇到以下情况:

  • 我在超类级别构造了一个结构体,它有一个UInt32列表来表示我需要建立物理体类型的各种位掩码。 (这是愚蠢的,因为在子类中不能覆盖struct属性。考虑删除。)
  • 在子类中,我创建了一个物理主体,它具有UInt32(4)的碰撞,接触和类别位掩码,由超类结构中的静态常量引用。
  • 这些实体通过结构属性中的UInt(2)的位掩码在超类中创建的地面落下。
  • 当我将静态常量从UInt(4)更改为0到32之间的任何奇数的无符号整数32时,这些实体不会从地面掉落。使用任何偶数使身体落在地上。

Superclass.swift

struct physicsBitMasks {
    static let one = UInt32(1) //for player
    static let two = UInt32(2) //for ground
    static let three = UInt32(3) //for you don't need to know
    static let four = UInt32(4) //for enemy

    ...
    ground.physicsBody?.categoryBitMask = physicsBitMasks.one
    ground.physicsBody?.contactTestBitMask = physicsBitMasks.one
    ground.physicsBody?.collisionBitMask = physicsBitMasks.two
}

Subclass.swift

Subclass: Superclass {
    //create enemy
    thing.physicsBody?.categoryBitMask =  physicsBitMasks.four
    thing.physicsBody?.contactTestBitMask = physicsBitMasks.four
    thing.physicsBody?.collisionBitMask = physicsBitMasks.four
}

敌人坠落地面

REDEFINE Superclass.swift

struct physicsBitMasks {
    static let one = UInt32(1) //for player
    static let two = UInt32(2) //for ground
    static let three = UInt32(3) //for you don't need to know
    static let four = UInt32(5) // or 7, 9, ...31 for enemy
}

敌人不会堕落。

发生了什么事?

1 个答案:

答案 0 :(得分:0)

playerMaskgroundMaskmysteryMaskenemyMask不会比onetwo,{{1}更好的名称}和three

另外,因为它们是位掩码组件,所以每个都需要一个唯一的位集。但是,3,例如,包含1和2的位。让我们这样定义它们:

four

现在您需要在身体上设置各种面具。您应该将每个人的身体struct BodyMask { static let Player = UInt32(1) static let Ground = UInt32(2) static let EmbarrassingSecret = UInt32(4) static let Enemy = UInt32(8) } 设置为其类型的掩码:

categoryBitMask

你需要根据你希望它反弹的其他身体来设置每个身体的ground.physicsBody?.categoryBitMask = BodyMask.Ground player.physicsBody?.categoryBitMask = BodyMask.Player enemies.forEach { $0.physicsBody?.categoryBitMask = BodyMask.Enemy } twilightNovel.physicsBody?.categoryBitMask = BodyMask.EmbarrassingSecret 。也就是说,你想让敌人从地面反弹吗?然后敌人的collisionBitMask必须包含collisionBitMask位。你想让地面从敌人身上反弹吗?还是反弹了什么?可能不是。请注意,这是不对称的!敌人可以在没有地面反弹的情况下反弹。也就是说,牛顿的第三定律(对于每一个动作都存在相同且相反的反应)并不一定适用。

如果你想让一个身体从多种其他身体类型中反弹,你可以按位或一起使用这些面具。让我们假设你想让敌人从地面和对方身上弹起来。

BodyMask.Ground

最后,如果您希望在两个实体发生碰撞时收到通知(无论它们是否反弹),您都可以使用ground.physicsBody?.collisionBitMask = 0 player.physicsBody?.collisionBitMask = BodyMask.Ground enemies.forEach { $0.physicsBody?.collisionBitMask = BodyMask.Ground | BodyMask.Enemy } twilightNovel.physicsBody?.collisionBitMask = BodyMask.Ground 。你可能想知道玩家何时接触敌人,或者当玩家做出令人尴尬的事情,即使你不一定希望玩家从敌人或无用的小说中反弹。

contactTestBitMask