【发布时间】:2017-08-29 00:49:08
【问题描述】:
此代码崩溃,因为 secondBody 未与节点关联。
func didBegin(_ contact: SKPhysicsContact) {
// Set vars to hold bodies
var firstBody: SKPhysicsBody
var secondBody: SKPhysicsBody
// Sort bodies
if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
firstBody = contact.bodyA
secondBody = contact.bodyB
} else {
firstBody = contact.bodyB
secondBody = contact.bodyA
}
// Handle different contacts
if firstBody.categoryBitMask == BallBitMask && secondBody.categoryBitMask == TileBitMask {
didBallTileHit(tile: secondBody.node!) // Code crashes here :(
}
...
}
1) 除了将物理体设置为nil 之外,还有什么会导致物理体与 SpriteKit 中的节点失去关联?
2) 一开始就没有节点,物理体怎么可能存在?
【问题讨论】:
-
我不知道你崩溃的真正原因是什么,所以我不会发布答案,但我会尽力回答你的两个问题。关于 1),我假设为您的节点分配不同的物理体会导致原始物理体被解除关联。关于 2),节点属性是弱且可选的(为了避免与拥有节点的引用循环,我假设)。 SKPhysicsBody 的初始化器不将节点作为参数;您将创建的主体传递给节点的
physicsBody属性。我相信这样做会相应地设置 body 的node属性。 -
尽管如此,我会假设传递给您的方法的
contact(它是某种碰撞委托吗?)不包含分离的物理实体(即不属于节点的实体);有什么意义? -
@NicolasMiari 准确地说,分离的身体有什么意义?因此对正在发生的事情感到困惑!有什么建议吗?
-
我认为没有意义;由于对象的初始化方式和 API 的设置方式,这在逻辑上是可能的。
-
也许你可以继承
SKNode和/或SKPhysicsBody,用观察者覆盖涉及的属性并尝试捕捉节点何时变为nil?
标签: ios sprite-kit skphysicsbody sknode skphysicscontact