Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sprite kit 身体的奇怪行为_Sprite Kit_Skphysicsbody - Fatal编程技术网

Sprite kit 身体的奇怪行为

Sprite kit 身体的奇怪行为,sprite-kit,skphysicsbody,Sprite Kit,Skphysicsbody,在我的应用程序中,我想以编程方式为节点创建一个物理实体。但是,当我以编程方式创建物理体时,它似乎不起作用,尽管在SpriteKit编辑器中创建的物理体确实起作用。以编程方式创建physicsbody时,它不会与另一个节点发生冲突,而在编辑器中创建physicsbody时,它会发生冲突 这是我的密码: physicsBody = SKPhysicsBody(rectangleOf: size) if let body = self.physicsBody{ body.is

在我的应用程序中,我想以编程方式为节点创建一个物理实体。但是,当我以编程方式创建物理体时,它似乎不起作用,尽管在SpriteKit编辑器中创建的物理体确实起作用。以编程方式创建physicsbody时,它不会与另一个节点发生冲突,而在编辑器中创建physicsbody时,它会发生冲突

这是我的密码:

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中的一个bug吗?

当您这样做时

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

你需要扩展你的代码,我有一种感觉,你正在以某种方式重置身体,如果重置你的意思是再次将其设置为零,那么情况就不应该是这样。我在scenes upstate方法中设置了一个断点,并检查了物理体的值,它不是零。不,您正在应用一个新的通用物理体,而不是您创建的物理体,但这只能在物理体的另一个赋值中发生,对吗?是的,检查以确保您创建的实体是连接到SpritetAnk的实体,以便您能够正常工作!但是,您可以快速解释为什么在安装完成后执行闭包吗?因为在主线程上,它需要先完成当前进程,然后才能切换到新任务,DispatchQueue会将闭包抛出到一个新任务队列中,一旦当前进程完成,它将抓取该队列。基本上你是在洗盘子,有人把一个新盘子放进要洗的盘子堆里,一旦你洗完当前的盘子,你就可以拿下一个需要清洗的盘子。