我正在使用SpriteKit和Swift进行碰撞检测。我有一个响应与didBeginContact函数碰撞的SKScene:
func didBeginContact(contact: SKPhysicsContact) {
if (contact.bodyA.categoryBitMask == ColliderType.Food && contact.bodyB.categoryBitMask == ColliderType.Head) {
placeFoodInRandomGridLocation()
}
}
func placeFoodInRandomGridLocation() {
let randomX = arc4random_uniform(UInt32(myGrid.columnCount))
let randomY = arc4random_uniform(UInt32(myGrid.rowCount))
foodSpriteHolder.position = CGPoint(x: colLines[Int(randomX)], y: rowLines[Int(randomY)])
}
问题是我可以在此didBeginContact函数触发之前轻松调整foodSpriteHolder的位置。当调用placeFoodInRandomGridLocation时,它根本不会移动foodSpriteHolder。
这似乎是范围问题。我只是不确定如何理清这个职位不会更新的原因。我甚至可以在这个流中隐藏foodSpriteHolder可见性......所以,我知道我可以访问它。
这里的参考是如何为foodSpriteHolder中的Food类项设置物理体:
self.physicsBody = SKPhysicsBody(rectangleOfSize: self.size, center: CGPointMake(reducedSize/2, reducedSize/2))
self.physicsBody?.affectedByGravity = false
self.physicsBody?.categoryBitMask = ColliderType.Food
最后,placeFoodInRandomGridLocation函数肯定被调用...位置不会更新。
感谢您的任何想法, 约什
答案 0 :(得分:0)
这种情况下的答案是在检测到碰撞时删除节点:
contact.bodyA.node?.removeFromParent()
现在我可以在新位置创建一个新节点。由于affectedByGravity设置为false,因此节点不会更新其位置。