关于分类比特面具,有一些东西一直困扰着我,我现在需要对它们有更多的了解.我理解他们在根本层面上是如何工作的.假设我正在制作一个地下城爬虫的基本破解和砍杀能力.我可能会使用如下类别的集合:

enum PhysicsCategory{
    static let none: UInt32 = 0
    static let playerCategory: UInt32 = 0b1
    static let enemyCategory: UInt32 = 0b10
    static let weaponCategory: UInt32 = 0b100
    static let collectibleCategory: UInt32 = 0b1000
    static let enemyProjectileCategory: UInt32 = 0b10000
}

这可能就足够了,我可以测试我是在攻击敌人,还是他们在攻击我,等等.也就是说,如果我想做一个有不同敌人等级、不同武器类型、不同敌人弱点和优势的地下城爬虫,我感觉我很快就会用完类别:

enum PhysicsCategory{
    static let none: UInt32 = 0
    static let playerCategory: UInt32 = 0b1

    static let toxicWeaponCategory: UInt32 = 0b10
    static let iceWeaponCategory: UInt32 = 0b100
    static let explosiveWeaponCategory: UInt32 = 0b1000
    static let bluntWeaponCategory: UInt32 = 0b10000

    static let toxicEnemyCategory: UInt32 = 0b100000
    static let iceEnemyCategory: UInt32 = 0b1000000
    static let explosiveEnemyCategory: UInt32 = 0b10000000
}

我没有敌人的 Select ,甚至还没有接触到Collection 品、环境物品或老板的弱点和/或优势构成了全新的组合.这些事情通常是如何解释的?我试图提出的要求比你上面看到的更多,我读过的书/指南只在非常基本的层面上解释了这一点.

推荐答案

categoryBitmasks主要用于接触和碰撞检测,并建立与什么已经在高级别接触,即玩家与Collection 品,敌人与武器等.我会忍不住将这些 node (敌人,Collection 品,老板)的子类,并使‘效果’(有毒,冰,爆炸性的)在 node 内的一个属性,这样在与某物进行接触后,你可以调用didBegin()中基于敌人‘EfftType’的适当 routine .

所有的触点都要经过didBegin()次测试,而且无论如何你都必须测试有毒/冰/爆炸物类别来确定如何处理触点,所以改变这个逻辑来测试所接触的 node 内的属性实际上不会给你的程序增加太多(如果有的话)代码.

编辑:你可以这样编码你的didBegin()人:

      func didBegin(_ contact: SKPhysicsContact) {
         print("didBeginContact entered for \(String(describing: contact.bodyA.node!.name)) and \(String(describing: contact.bodyB.node!.name))")
    
         let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
    
         switch contactMask {
         case  playerCategory | enemyCategory:
            print("Playerand enemy have contacted.")
            let playerNode = contact.bodyA.categoryBitMask == playerCategory ? contact.bodyA.node : contact.bodyB.node
            let enemyNode = contact.bodyA.categoryBitMask == enemyCategory ? contact.bodyA.node : contact.bodyB.node
            let enemyType = enemyNode.contactType // toxic, ice, explosive
            processCollision(between: playerNode and: enemyNode ofType: enemyType)
    
         default:
            print("Some other contact occurred")
         }

尽管你更有可能在processCollision()分钟内提取出敌人的类型

如果您不熟悉SWIFT的参数参数标签,那么processCollision的定义可以是:

func: processCollision(between node: SKSpriteNode, and node2: SkSpriteNode ofType type: string)

这允许您在函数中引用node1和node2,但调用语法更具可读性.此外,type可能是可用的敌人类型的一个枚举.

Swift相关问答推荐

变量捕获:变量在函数闭包中的行为

如何使用Swift宏向 struct 体及其init函数添加新成员?

Swift:iVar + Equatable上的协议约束

有没有一种方法可以迭代可编码的代码(例如,JSON解析中的每一项)?

使 tabview 垂直将视图移动到右侧 swift ui

使用`JSONSerialiser`时,省略通用可选项

除法中如果除以完全因数需要更长时间吗?

使用View()和List()无法显示影子

CardStack 和 Lottie

在 Swift 5.7 中使用协议作为类型时什么时候需要写 `any`

将 Encodable 扩展添加到 Swift 嵌套枚举

来自数据的 SwiftUI 图像

如何以快速 Select 器菜单样式调整图像大小

当我必须在 Swift 中的类、 struct 和枚举之间进行 Select 时,我应该如何推理?

在 Swift 中将两个字节的 UInt8 数组转换为 UInt16

是 swift 中另一个日期的同一周、月、年的日期

修复 Swift 3 中的警告C-style for Statement is deprecated

如何在 Swift 中判断变量的类型

如何使用 Swift 将文本文件逐行加载到数组中?

iPhone 纵向和 iPad 横向的通用应用程序