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

标签 swift sprite-kit

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

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

父类(super class).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
}

子类.swift

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

敌人掉入地面

重新定义 父类(super class).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
}

敌人不会从地面掉下来。

这是怎么回事?

最佳答案

不会 playerMask , groundMask , mysteryMask ,和enemyMaskone更好的名字, two , three ,和four

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

struct BodyMask {
    static let Player = UInt32(1)
    static let Ground = UInt32(2)
    static let EmbarrassingSecret = UInt32(4)
    static let Enemy = UInt32(8)
}

现在你需要在你的身上设置各种面具。您应该设置每个 body 的 categoryBitMask其类型的掩码:

ground.physicsBody?.categoryBitMask = BodyMask.Ground
player.physicsBody?.categoryBitMask = BodyMask.Player
enemies.forEach { $0.physicsBody?.categoryBitMask = BodyMask.Enemy }
twilightNovel.physicsBody?.categoryBitMask = BodyMask.EmbarrassingSecret

你需要设置每个body的collisionBitMask基于您希望它反弹的其他物体。也就是说,你想让敌人从地面弹起来吗?然后敌人的collisionBitMask必须包括BodyMask.Ground少量。你想让地面从敌人身上弹开吗?还是因为其他什么东西而反弹?可能不会。请注意,这是不对称的!敌人可以在地面不弹起的情况下弹起。也就是说,牛顿第三定律(每个作用力都会产生大小相等且方向相反的 react )。

如果您希望一个物体从多个其他物体类型中反弹,您可以将 mask 一起按位或。假设您希望敌人从地面上弹起并相互弹起。

ground.physicsBody?.collisionBitMask = 0
player.physicsBody?.collisionBitMask = BodyMask.Ground
enemies.forEach { $0.physicsBody?.collisionBitMask = BodyMask.Ground | BodyMask.Enemy }
twilightNovel.physicsBody?.collisionBitMask = BodyMask.Ground

最后,如果您想在两个物体碰撞时收到通知(无论它们是否反弹),您可以使用 contactTestBitMask 。您可能想知道玩家何时接触敌人,或者玩家何时做了一些令人尴尬的事情,即使您不一定希望玩家从敌人或垃圾小说中弹开。

ground.physicsBody?.contactTestBitMask = 0
player.physicsBody?.contactTestBitMask = BodyMask.Enemy | BodyMask.EmbarrassingSecret
enemies.forEach { $0.physicsBody?.contactTestBitMask = 0 }
twilightNovel.physicsBody?.contactTestBitMask = 0

关于Swift Uint32 将所有偶数识别为相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35496932/

相关文章:

swift - 你如何获得 couchbase 数据库的大小

ios - 更改语言而不即时重新启动不适用于全局声明

ios - 无法在 View Controller 之间发送数据 Swift

swift - 如何在 SpriteKit 游戏中保存游戏进度

ios - SWIFT: "didBeginContact"函数中的 If 语句运行次数过多

ios - Core Audio Swift Equalizer 一次调整所有频段?

ios - 如何反转 UIView 特定区域的颜色?

ios - 暂停 SpriteKit 游戏 - UIApplicationWillResignActive 与 UIApplicationDidBecomeActive?

swift - 在 Touch 上移动 SKSpriteNode 以创建按钮效果

swift - 预加载场景以防止延迟?