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

Posted

技术标签:

【中文标题】Swift Uint32将所有偶数识别为相同【英文标题】:Swift Uint32 Recognizing All Even Numbers as the Same 【发布时间】:2016-02-19 03:45:38 【问题描述】:

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

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

超类.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

敌人从地上掉下来

重新定义 超类.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】:

playerMaskgroundMaskmysteryMaskenemyMask 不会是比 onetwothreefour 更好的名称吗?

此外,由于它们是位掩码组件,因此您需要每个组件都有一个唯一的位集。但是例如 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)

现在你需要在你的身体上设置各种面具。您应该将每个身体的 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。你可能想知道玩家什么时候碰到了一个敌人,或者什么时候玩家做了一些令人尴尬的事情,即使你不一定希望玩家从敌人或垃圾小说中反弹。

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

【讨论】:

碰撞需要二进制或者,好的。碰撞位掩码是它会反弹的东西的位掩码。这些不是确切的名称。谢谢

以上是关于Swift Uint32将所有偶数识别为相同的主要内容,如果未能解决你的问题,请参考以下文章

设计把所有的奇数移动到所有偶数前面的算法

在 Swift 中如何知道一个数字是奇数还是偶数?

为啥这个函数在 Swift 中用于确定整数的输入是奇数还是偶数?

在excel/openoffice calc中增加奇数或偶数?

用数组编写:将一整数数列按奇数在前、偶数在后的顺序重新排放,并要求奇偶数两部分分别有序

空格在 fread 中未被识别为 NA