SKPhysicsBody的奇怪行为
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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是节点的size属性。
当我现在注释掉物理体被分配给节点的第一行,而是在SpriteKit场景编辑器中设置物理体时,它确实有效。请注意,在两种情况下都会执行if条件中的代码。
更新:
有趣的是,当我这样做时:
physicsBody = SKPhysicsBody(bodies: [physicsBody!])
这应该没有任何影响,因为它基本上没有任何改变,然后它也不起作用。这是SpriteKit中的错误吗?
答案
当你这样做
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
}
}
以上是关于SKPhysicsBody的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章
SKPhysicsBody bodyWithPolygonFromPath 内存泄漏