我知道如何检查两个sprite是否在spritekit中联系(使用contact.bodyA和contact.bodyB)。有人可以解释我如何检查三个精灵是否相互接触? (例如,三个方形精灵接触,因为它们彼此堆叠在一起)
THX
修改 我已经发现可以使用allContactedBodies来查找一个机构的所有联系人。见下面的代码。但由于某种原因,for循环会出错。错误:' [AnyObject]?'没有名为'发电机' 的成员有没有人如何解决此问题?
func didBeginContact(contact:SKPhysicsContact) {
var node1:SKNode = contact.bodyA.node!
var node2:SKNode = contact.bodyB.node!
if ( node1.physicsBody?.categoryBitMask == node2.physicsBody?.categoryBitMask ) {
let bodies = node1.physicsBody?.allContactedBodies()
if bodies?.count > 3 {
NSLog("%i", bodies!.count)
for potentialBody : AnyObject in bodies {
if let body = potentialBody as? SKPhysicsBody {
body.node?.removeFromParent()
}
}
}
}
}
答案 0 :(得分:1)
考虑这个未经测试的代码:
func didBeginContact(contact:SKPhysicsContact) {
let bodies = contact.bodyA.node!.physicsBody!.allContactedBodies()
if bodies.count > 1 {
NSLog("%i", bodies!.count)
for body:SKPhysicsBody in bodies {
body.node!.removeFromParent()
}
}
}
首先,如果物体接触,它们的位掩码至少会重叠,因此不需要检查位掩码(除非你想尽可能具体)。此外,如果您认为contact.bodyA.node
不是nil,那么您可以假设它有一个physicsBody
,因为它正在联系(只有physicsBody
才可以)。
此外,您对三个(或更多?)身体接触感兴趣,因此您只需要检查多个身体接触一个身体,因此检查> 1
意味着“如果这个联系中涉及两个以上的机构(例如三个),那么......“。
最后,bodies
包含一组SKPhysicsBody
个对象,没有nil
个值(如果它们是nil
,那么它们就不会参与此碰撞) ,因此可以安全地将bodies
中的任何对象投射到SKPhysicsBody
。您可以假设physicsBody
拥有一个拥有节点,除非您的自由体未连接到节点。如果您想要安全,只需在此处查看nil
。
答案 1 :(得分:0)
square以下代码将起作用,感谢所有帮助:
func didBeginContact(contact:SKPhysicsContact) {
let bodies = contact.bodyA.node?.physicsBody?.allContactedBodies()
if ( bodies!.count > 1 ) {
NSLog("%i", bodies!.count)
for body:AnyObject in bodies ?? [] {
if body.categoryBitMask == squareCategory {
body.node??.removeFromParent()
}
}
}
}
答案 2 :(得分:0)
这是更好的版本:
func didBeginContact(contact: SKPhysicsContact) {
let bodies = contact.bodyA.node!.physicsBody!.allContactedBodies()
if (bodies.count > 1) {
for body in bodies {
if body.categoryBitMask == contact.bodyA.categoryBitMask {
body.node!?.removeFromParent()
}
}
}
}