iOS 如何检查三个 Sprite 是否接触

标签 ios objective-c swift sprite-kit

我知道两个如何检查两个 Sprite 是否在 spritekit 中接触(使用 contact.bodyA 和 contact.bodyB)。有人可以解释我如何检查三个 Sprite 是否相互接触吗? (例如,三个正方形 Sprite 相互接触,因为它们堆叠在一起)

谢谢

编辑: 我发现可以使用 allContactedBodies 来查找一个 body 的所有联系人。请参阅下面的代码。但是出于某种原因,for 循环出现错误。错误:'[AnyObject]?'没有名为“Generator”的成员 谁能解决这个问题?

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

最佳答案

考虑这个未经测试的代码:

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

首先,如果 body 接触,它们的位掩码至少会重叠,所以没有必要检查位掩码(除非你想尽可能具体)。此外,如果您假设 contact.bodyA.node 不为零,那么您可以假设它有一个 physicsBody 因为它正在被联系(这只有在物理体)。

此外,您对接触的三个(或更多?)物体感兴趣,因此您只需要检查一个以上的物体是否与一个物体接触,因此检查 > 1 的意思是“如果有两个以上的机构(例如三个)参与此联系,那么......”。

最后,bodies 包含一组 SKPhysicsBody 对象,没有 nil 值(如果它们是 nil,则它们不参与此碰撞),因此将 bodies 中的任何对象转换为 SKPhysicsBody 是安全的。您可以假定 physicsBody 有一个所属节点,除非您有未附加到节点的自由体。如果您想安全起见,只需在此处检查 nil

关于iOS 如何检查三个 Sprite 是否接触,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26806260/

相关文章:

objective-c - iOS:发送短信

ios fmdb 从文件加载数据库

iphone - UIWebView 不调用 UIScrollViewDelegate 方法

ios - 选择所有如果 blah.. 否则选择所有 blah

ios - Swift:重用代码将类传递给参数

jquery - iOs 跳转包含 INPUT 的固定页脚

ios - iOS的位置服务中 "Always"和 "While Using App"之间的区别

iphone - Google Drive SDK- iOS 应用程序中的音频和视频流

swift:与 ‘UIPickerView’ 不同

swift - Swift 中的 DNA 到 RNA 转录