在我的应用程序中,我想以编程的方式为节点创建一个物理体。然而,当我以编程方式创建物理体时,它似乎不起作用,尽管在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
}
大小是节点的大小属性。
现在,当我注释掉将物理体分配给节点的第一行时,而是在SpriteKit场景编辑器中设置物理体时,它就可以工作了。请注意,在这两种情况下,if条件内的代码都正在执行。
更新
有趣的是,当我这样做时:
physicsBody = SKPhysicsBody(bodies: [physicsBody!])
这不应该有任何影响,因为它基本上改变不了什么,然后它也不起作用。这是SpriteKit中的一个bug吗?
发布于 2017-12-21 14:55:03
当你这样做的时候
required init?(coder aDecoder: NSCoder) {
factor = 0.5
super.init(coder: aDecoder)
self.pBody()
}
physicsWorld还不存在,所以身体不会被放置在这个世界上。
您希望在创建它之后执行它,所以将代码放入一个闭包中,以便在安装完成后启动。您可以使用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
}
}
https://stackoverflow.com/questions/47928372
复制相似问题