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条件中的代码。

enter image description here

更新:

有趣的是,当我这样做时:

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 内存泄漏

更改 SKPhysicsBody 参数无效

listView 中复选框的奇怪行为

片段 popbackstack 行为在 25.1.0 和 25.1.1 中被破坏

Seekbar进度drawable异常行为onPause

片段在我的回收站视图中表现得很奇怪