我有简单的游戏,其功能如下:
我的目标是检测何时球击中白色部分(将加载场景游戏)或何时球击中灰色部分(游戏继续)
因为形状会缩小并且会发生很多事情,所以我认为仅在需要时创建SKPhysicsBody,然后在发生碰撞检查后将其删除,这样效率会更高。因此,当我单击屏幕时,会发生以下情况:(经过5 * 0.0325秒-圆收缩所需的时间-已过时,它将把物理体添加到灰色和白色部分,以便我可以检测到哪个球是接触)
DispatchQueue.main.asyncAfter(deadline: .now() + seconds, execute: {
let trackPhysics = SKPhysicsBody(texture: track.texture!, size: track.texture!.size())
trackPhysics.isDynamic = false
trackPhysics.affectedByGravity = false
track.physicsBody = trackPhysics
let goalPhysics = SKPhysicsBody(texture: goal.texture!, size: goal.texture!.size())
goalPhysics.isDynamic = false
goalPhysics.affectedByGravity = false
goal.physicsBody = goalPhysics
})
哪个有效。 SKPhysicsBody可以完美地应用于灰色和白色部分,而不会降低帧速率,并且可以跟随旋转。问题是...我该如何检测哪个球在碰?由于它们没有正式碰撞,因此根本不会调用碰撞(这很有意义,因为它们并未真正碰撞
这是基本逻辑,在我要检查结果之前,它可以完美地工作:
我已经试过了:
func didBegin(_ contact: SKPhysicsContact) {
print("touching!")
}
func didEnd(_ contact: SKPhysicsContact) {
print("not touching")
}
完全没有消息,并且在应用SKPhysicsBody后1秒钟尝试使用allContactedBodies(),但对所有消息返回的计数均为0。我什至尝试过使这5秒仍然无法正常工作
DispatchQueue.main.asyncAfter(deadline: .now() + seconds + 1, execute: {
print(track.physicsBody!.allContactedBodies().count)
print(goal.physicsBody!.allContactedBodies().count)
})
这就是应用SKPhysicsBody的样子,您可以看到物理已完美地应用了
难道我做错了什么?有任何想法吗?
最佳答案
解决方案(如在上面的评论中发现的)是:
isDynamic
属性设置为true
,以使冲突检测正常工作。 didBegin(contact:)
是否已设置,确保正在调用physicsWorld.contactDelegate
。 关于ios - 应用SKPhysicsBody后检测SKPhysicsBody碰撞,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41412183/