在SpriteKit中,我们检测didBeginContact方法中的in。但是这样做看起来有点愚蠢: func didBeginContact(联系人: SKPhysicsContact) {
if let contactA = contact.bodyA.node?.name {
if let contactB = contact.bodyB.node?.name {
//now that we have safely unwrapped these nodes, we can operate on them
if contactA == "ball" {
collisionBetweenBall(contact.bodyA.node!, object: contact.bodyB.node!)
} else if contactB == "ball" {
collisionBetweenBall(contact.bodyB.node!, object: contact.bodyA.node!)
}
}
}
}有什么办法可以确保bodyA总是一个球吗?有与分类掩码相关的规则吗?
发布于 2016-11-05 08:51:43
如果您使用的是简单的类别,而每个物理体只属于一个类别,那么这种可供选择的didBeginContact形式可能更容易读懂:
func didBeginContact(contact: SKPhysicsContact) {
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
switch contactMask {
case categoryBitMask.ball | categoryBitMask.something:
print("Collision between ball and something")
let ballNode = contact.bodyA.categoryBitMask == categoryBitMask.ball ? contact.bodyA.node! : contact.bodyB.node!
ballNode.pop()
score += 10
default :
//Some other contact has occurred
print("Some other contact")
}
}请注意,如果您的类别更复杂,这将无法工作,因为简单和测试(categoryBitMask.ball | categoryBitMask.something)将不匹配。
发布于 2016-11-11 21:57:13
通常你会这么做
首先,如果您还没有存储位掩码类别,就会存储它。
enum PhysicsCategory {
static let ball: UInt32 = 0x1 << 0
static let wall: UInt32 = 0x1 << 1
static let enemy: UInt32 = 0x1 << 2
}而不是像这样把它们分配给你的精灵
ball.physicsBody?.categoryBitMask = PhysicsCategory.ball
ball.physicsBody?.contactTestBitMask = PhysicsCategory.wall | PhysicsCategory.enemy
wall.physicsBody?.categoryBitMask = PhysicsCategory.wall
wall.physicsBody?.contactTestBitMask = 0
enemy.physicsBody?.categoryBitMask = PhysicsCategory.enemy
enemy.physicsBody?.contactTestBitMask = 0 注意:因为在这个例子中,球检查与墙壁和敌人的接触,所以你不需要告诉墙或敌人去检查与球的接触。可以在1物理体上做这件事,这样你就可以在其他人身上设置为0,除非他们有其他特定的联系人需要寻找。
在没有双if语句的情况下,您可以在contact方法中检查它们。
func didBegin(_ contact: SKPhysicsContact) {
let firstBody: SKPhysicsBody
let secondBody: SKPhysicsBody
if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
firstBody = contact.bodyA
secondBody = contact.bodyB
} else {
firstBody = contact.bodyB
secondBody = contact.bodyA
}
// Ball hit wall or wall hit ball
if (firstBody.categoryBitMask == PhysicsCategory.ball) && (secondBody.categoryBitMask == PhysicsCategory.wall) {
// Some code
}
// Ball hit enemy or enemy hit ball
if (firstBody.categoryBitMask == PhysicsCategory.ball) && (secondBody.categoryBitMask == PhysicsCategory.enemy) {
// Some code
}
}另外,不要忘记在场景的didMoveToView中设置委托以使其工作。
physicsWorld.contactDelegate = self希望这能有所帮助
https://stackoverflow.com/questions/40436300
复制相似问题