SKPhysicsBody

时间:2017-12-21 15:48:43

标签: sprite-kit 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中的错误吗?

1 个答案:

答案 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
    }
}