Swift 快速检测碰撞和设置枚举

Swift 快速检测碰撞和设置枚举,swift,enums,sprite-kit,collision,Swift,Enums,Sprite Kit,Collision,我试图弄清楚在设置枚举时检测碰撞是如何工作的。我有几个不同的节点,我可以检测冲突,并已设置工作,但我刚刚翅膀它,不知道如何正确设置它 enum ColliderType: UInt32{ case ship = 1 case object = 2 case fuel = 4 case alien = 8 case torp = 16 } 然后,我将每个节点设置为: mete.physicsBody!.contactTestBitMask = Coll

我试图弄清楚在设置枚举时检测碰撞是如何工作的。我有几个不同的节点,我可以检测冲突,并已设置工作,但我刚刚翅膀它,不知道如何正确设置它

enum ColliderType: UInt32{

    case ship = 1
    case object = 2
    case fuel = 4
    case alien = 8
    case torp = 16

}
然后,我将每个节点设置为:

mete.physicsBody!.contactTestBitMask = ColliderType.object.rawValue
mete.physicsBody!.categoryBitMask = ColliderType.object.rawValue
mete.physicsBody!.collisionBitMask = ColliderType.object.rawValue

alien.physicsBody!.contactTestBitMask = ColliderType.torp.rawValue
alien.physicsBody!.categoryBitMask = ColliderType.alien.rawValue
alien.physicsBody!.collisionBitMask = ColliderType.alien.rawValue

fuel.physicsBody!.contactTestBitMask = ColliderType.ship.rawValue
fuel.physicsBody!.categoryBitMask = ColliderType.fuel.rawValue
fuel.physicsBody!.collisionBitMask = ColliderType.fuel.rawValue


ship.physicsBody!.contactTestBitMask = ColliderType.object.rawValue
ship.physicsBody!.categoryBitMask = ColliderType.ship.rawValue
ship.physicsBody!.collisionBitMask = ColliderType.ship.rawValue

torpedoNode.physicsBody!.contactTestBitMask = ColliderType.alien.rawValue
torpedoNode.physicsBody!.categoryBitMask = ColliderType.torp.rawValue
torpedoNode.physicsBody!.collisionBitMask = ColliderType.alien.rawValue
然后,为了检测船和仪表之间的碰撞,我使用以下代码:

if contact.bodyA.categoryBitMask == ColliderType.object.rawValue || contact.bodyB.categoryBitMask == ColliderType.object.rawValue
船舶与我使用的燃料发生碰撞:

if contact.bodyA.categoryBitMask == ColliderType.fuel.rawValue || contact.bodyB.categoryBitMask == ColliderType.fuel.rawValue {
最后是鱼雷和外星人之间的碰撞我使用以下代码:

if contact.bodyA.categoryBitMask == ColliderType.alien.rawValue || contact.bodyB.categoryBitMask == ColliderType.torp.rawValue {

一切都很完美,但我现在正试图检测飞船和外星人之间的碰撞,我不知道该怎么做。我需要尝试理解逻辑并清理代码

如果您希望在船舶与仪表、燃料或外星人接触(而不是碰撞)时通知您的代码,您应该:

ship.physicsBody!.contactTestBitMask = ColliderType.object.rawValue | ColliderType.fuel.rawValue | ColliderType.alien.rawValue
i、 e.接触测试位掩码等于
对象
燃料
外来物

在这里查看这个简单的精灵工具包项目,使用联系人、碰撞、触摸事件和一个帮助函数(
checkPhysics()
),该函数将分析您的物理设置-此函数可以放入任何精灵工具包项目中并调用,以显示哪些物理实体之间将发生哪些接触和碰撞

其他信息:

值得记住的是,除非您另外指定,否则所有内容都会与其他内容发生冲突,并且没有任何内容与任何内容相接触

i、 e.每个节点的
collisonBitMask
设置为all
1
s,其
contactTestbitMask
设置为all
0
s

节点A和节点B之间的接触或碰撞可通过以下方式关闭:

nodeA.physicsBody?.collisionBitMask &= ~nodeB.category
我们使用nodeB的类别位掩码的倒数(逻辑NOT,~运算符)从逻辑上和nodeA的位掩码进行比较,以“关闭”该位nodeA的位掩码

nodeA和nodeC之间的接触或碰撞可在任何点通过以下方式打开:

nodeA.physicsBody?.contactTestBitMask |= nodeC.category
我们在逻辑上使用nodeC的类别位掩码和nodeA的位掩码来“打开”nodeA位掩码中的位

您可以确保每个形状都从屏幕边缘“反弹”,如下所示:

// Make sure everything collides with the screen edge
enumerateChildNodes(withName: "//*") { node, _ in
    node.physicsBody?.collisionBitMask |= self.edgeCategory  //Add edgeCategory to the collision bit mask
}

“ColliderType”只是一个物理类别。将类别设置为对象的collisionBitMask和contactTestBitMask实际上没有多大意义。这里有很多答案,可以解释您感兴趣的内容:,等等……首先,了解接触和碰撞之间的区别,并开始使用正确的术语-您不会检测到碰撞,你可以检测联系人。-我已经将ColliderType.alien.rawValue添加到舰船联系人位掩码中。然后,如果contact.bodyA.categoryBitMask==ColliderType.alien.rawValue | | contact.bodyB.categoryBitMask==ColliderType.alien.rawValue,我会使用吗{?我尝试了一些组合,但它通常会弄乱其他联系人。@Alex-是的,但是如果您想避免所有那些“if..then”以及bodyA和bodyB的事情,请查看此示例,以获得一种更干净的方法来实现DidBeagin(联系人:)-