据我了解碰撞在Swift SpriteKit中的工作方式;您可以识别位掩码的组合,识别可能与之发生冲突的内容,并处理名为didBegin
的事件。这是我的方法版本:
func didBegin(_ contact: SKPhysicsContact) {
print("test")
print (contact.bodyA.node?.name)
print (contact.bodyB.node?.name)
}
然后我为三个不同的类别设置了一个掩码:
private let collisionAlien : UInt32 = 1 << 0
private let collisionBullet : UInt32 = 1 << 1
private let collisionPlayer : UInt32 = 1 << 2
根据我的理解,应该导致:
...001
...010
...100
最后,我设置了每个屏幕元素的类别:
player.physicsBody?.categoryBitMask = collisionPlayer
player.physicsBody?.collisionBitMask = 0
player.physicsBody?.contactTestBitMask = 0
...
alien.physicsBody?.categoryBitMask = collisionAlien
alien.physicsBody?.collisionBitMask = 0
alien.physicsBody?.contactTestBitMask = collisionPlayer
我的理解是,当一个外星人与玩家接触时,该事件应该发射,但两者之间不应发生任何物理交互。虽然后者是真的(物体通过彼此),但前者不是。事件不会发生。
显然,我误解了这种互动的根本性。例如,当外星人与玩家相交时,我怎样才能引发有问题的事件?