我试图了解设置枚举时如何检测碰撞。我有几个不同的节点,我可以检测到碰撞,并设置工作,但我刚刚飞过它,并不知道如何正确设置它。
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 {
一切都很完美但是我现在正试图探测船与外星人之间的碰撞,我无法解决如何去做这件事。我需要尝试理解逻辑并清理此代码。
答案 0 :(得分:2)
如果您希望在船舶联系人(不会发生碰撞)时通知您的代码,不管是燃料还是外星人,您都应该:
ship.physicsBody!.contactTestBitMask = ColliderType.object.rawValue | ColliderType.fuel.rawValue | ColliderType.alien.rawValue
即。联系人测试位掩码等于object
或fuel
或alien
。
在SO上查看这个简单的Sprite-Kit项目,包括触点,碰撞,触摸事件和辅助函数(checkPhysics()
),它将分析您的物理设置 - 此函数可以放入任何sprite-Kit项目中并调用以显示在哪个物理机构之间会发生什么接触和碰撞。
其他信息:
值得记住的是,除非你另有说明,否则一切都会与其他所有内容发生碰撞而且什么也没有联系。
即。每个节点collisonBitMask
设置为所有1
,其contactTestbitMask
设置为所有0
。
nodeA和nodeB之间的联系人或冲突可以使用以下方式关闭:
nodeA.physicsBody?.collisionBitMask &= ~nodeB.category
我们逻辑地将nodeA的bitMask与nodeB的类别位掩码的反(逻辑NOT,〜运算符)相关联,以关闭'位nodeA的bitMask。
nodeA和nodeC之间的联系人或冲突可以在任何时候使用以下方式 ON :
nodeA.physicsBody?.contactTestBitMask |= nodeC.category
我们逻辑地将nodeA的bitMask与nodeC的类别位掩码一起打开'打开' nodeA< bitMask中的那个位。
你可以确保每个形状都能反弹出来。屏幕边缘如下:
// Make sure everything collides with the screen edge
enumerateChildNodes(withName: "//*") { node, _ in
node.physicsBody?.collisionBitMask |= self.edgeCategory //Add edgeCategory to the collision bit mask
}