如何在Swift中为SpriteKit定义类别位掩码枚举?

Raf*_*fAl 28 objective-c bit-masks ios sprite-kit swift

要在Objective-C中定义类别位掩码枚举,我曾经输入:

typedef NS_OPTIONS(NSUInteger, CollisionCategory)
{
    CollisionCategoryPlayerSpaceship = 0,
    CollisionCategoryEnemySpaceship = 1 << 0,
    CollisionCategoryChickenSpaceship = 1 << 1,
};
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现相同的使用Swift?我尝试了枚举,但无法使其正常工作.这是我到目前为止所尝试的.

错误截图

nsc*_*hum 19

你可以做的是使用二进制文字:0b1,0b10,0b100等.

但是,在Swift中你不能按位OR枚举,所以在枚举中使用位掩码确实没有意义.查看此问题以获取NS_OPTION的替代品.


Wil*_* T. 19

如果你看一下这个swift教程,你可以使用以下命令来避免整个toRaw()或rawValue转换:

struct PhysicsCategory {
  static let None      : UInt32 = 0
  static let All       : UInt32 = UInt32.max
  static let Monster   : UInt32 = 0b1       // 1
  static let Projectile: UInt32 = 0b10      // 2
}

monster.physicsBody?.categoryBitMask = PhysicsCategory.Monster 
monster.physicsBody?.contactTestBitMask = PhysicsCategory.Projectile 
monster.physicsBody?.collisionBitMask = PhysicsCategory.None 
Run Code Online (Sandbox Code Playgroud)


小智 9

看看AdvertureBuilding SpriteKit游戏.他们在Swift中重建了它,您可以在iOS8开发站点上下载源代码.

他们使用以下创建枚举的方法:

enum ColliderType: UInt32 {
  case Hero = 1
  case GoblinOrBoss = 2
  case Projectile = 4
  case Wall = 8
  case Cave = 16
}
Run Code Online (Sandbox Code Playgroud)

设置就像这样

physicsBody.categoryBitMask = ColliderType.Cave.toRaw()
physicsBody.collisionBitMask = ColliderType.Projectile.toRaw() | ColliderType.Hero.toRaw()
physicsBody.contactTestBitMask = ColliderType.Projectile.toRaw()
Run Code Online (Sandbox Code Playgroud)

并检查如下:

func didBeginContact(contact: SKPhysicsContact) {

// Check for Projectile
    if contact.bodyA.categoryBitMask & 4 > 0 || contact.bodyB.categoryBitMask & 4 > 0   {
          let projectile = (contact.bodyA.categoryBitMask & 4) > 0 ? contact.bodyA.node : contact.bodyB.node
    }
}
Run Code Online (Sandbox Code Playgroud)