在我的应用程序中,我想以编程方式为节点创建物理主体。然而,当我以编程方式创建物理主体时,它似乎无法工作,尽管在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是节点的size属性。
当我现在注释掉物理体被分配给节点的第一行,而不是在SpriteKit场景编辑器中设置物理体时,它确实有效。请注意,在两种情况下都会执行if条件中的代码。
更新:
有趣的是,当我这样做时:
physicsBody = SKPhysicsBody(bodies: [physicsBody!])
它不会产生任何影响,因为它基本上没有任何改变,那么它也不会起作用。这是SpriteKit中的错误吗?
答案 0 :(得分:3)
当你这样做时
required init?(coder aDecoder: NSCoder) {
factor = 0.5
super.init(coder: aDecoder)
self.pBody()
}
物理世界还不存在,所以身体不会被置于世界之中。
您希望在创建后执行此操作,因此请将代码放入要在安装完成后启动的闭包中。您可以使用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
}
}