iOS如何检查三个精灵是否联系

时间:2014-11-07 16:59:38

标签: ios objective-c swift sprite-kit

我知道如何检查两个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()
                }
            }
        }
    }
}

3 个答案:

答案 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()
            }
        }
    }
}