SKPhysicsBody 的奇怪行为
Strange behaviour of SKPhysicsBody
在我的应用程序中,我想以编程方式为节点创建物理体。然而,当我以编程方式创建物理体时,它似乎不起作用,尽管在 SpriteKit 编辑器中创建的物理体确实有效。当物理体以编程方式创建时,它不会与另一个节点发生碰撞,而当它在编辑器中创建时,它会发生碰撞。
这是我的代码:
physicsBody = SKPhysicsBody(rectangleOf: size)
if let body = self.physicsBody{
body.isDynamic = true
body.affectedByGravity = false
body.allowsRotation = false
body.categoryBitMask = CollisionCategoryBitmask.shootWall.rawValue
body.collisionBitMask = CollisionCategoryBitmask.circle.rawValue
body.contactTestBitMask = CollisionCategoryBitmask.circle.rawValue
}
size 是节点的大小属性。
当我现在注释掉物理体分配给节点的第一行并改为在 SpriteKit 场景编辑器中设置物理体时,它确实起作用了。请注意,在这两种情况下,if 条件中的代码都会被执行。
更新:
有趣的是,当我这样做时:
physicsBody = SKPhysicsBody(bodies: [physicsBody!])
这应该不会有任何影响,因为它基本上什么都没改变,所以它也不起作用。这是 SpriteKit 中的错误吗?
当你这样做时
required init?(coder aDecoder: NSCoder) {
factor = 0.5
super.init(coder: aDecoder)
self.pBody()
}
physicsWorld 尚不存在,因此 body 未放置在世界中。
您想在创建后执行此操作,因此请将您的代码放入闭包中,以便在设置完成后启动。您可以使用 DispatchQueue
required init?(coder aDecoder: NSCoder) {
factor = 0.5
super.init(coder: aDecoder)
DispatchQueue.main.async {
self.pBody() //This will fire after the SKS finished building the scene, so physicsWorld will exist
}
}