快速检测碰撞并设置枚举

时间:2017-03-22 01:46:02

标签: 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 = 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 {

一切都很完美但是我现在正试图探测船与外星人之间的碰撞,我无法解决如何去做这件事。我需要尝试理解逻辑并清理此代码。

1 个答案:

答案 0 :(得分:2)

如果您希望在船舶联系人(不会发生碰撞)时通知您的代码,不管是燃料还是外星人,您都应该:

ship.physicsBody!.contactTestBitMask = ColliderType.object.rawValue | ColliderType.fuel.rawValue | ColliderType.alien.rawValue

即。联系人测试位掩码等于objectfuelalien

在SO上查看这个简单的Sprite-Kit项目,包括触点,碰撞,触摸事件和辅助函数(checkPhysics()),它将分析您的物理设置 - 此函数可以放入任何sprite-Kit项目中并调用以显示在哪个物理机构之间会发生什么接触和碰撞。

Attack button in SpriteKit

其他信息:

值得记住的是,除非你另有说明,否则一切都会与其他所有内容发生碰撞而且什么也没有联系。

即。每个节点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
}