有没有一种简单的方法可以暂时禁用 Swift 中精灵的物理体? (雪碧套件)

Is there a simple way to temporarily disable the physics bodies for a sprite in Swift? (SpriteKit)

我正在制作一个迷宫应用程序,它会在完成一个迷宫后生成一个新的迷宫。显然,我可以通过执行我在代码 wall[location].isHidden = true 中所做的操作来隐藏墙壁(每个墙壁都有自己的物理和精灵存储在数组的位置),但我找不到方法来做同样的事情物理体绑定到墙上,形成一堵无形的墙。有没有一种简单的方法可以在不将其设置为 nil 的情况下做到这一点?

澄清一下,并不是我不希望它是动态的,我只是希望在解决迷宫时整个事物都不存在。 我不想将它设置为 nil 的唯一原因是我不知道如何以简单的方式恢复它的旧物理体。

当然

刚刚设置

isDynamic = false
wall.physicsBody?.collisionBitMask = 0
wall.physicsBody?.contactTestBitMask = 0

这几乎将 SKPhysicsBody 与系统的其余部分隔离开来。你有任何 SKJoints 连接到你的身体节点吗?如果这样做,这可能会很尴尬。

或者您可以将其设置为零

wall.physicsBody? = nil

然后只需创建一个方法,在您准备好时再次设置它

 func addPhysics() {
    wall.physicsBody = SKPhysicsBody(circleOfRadius: 5)
    wall.isDynamic = true
    wall.physicsBody?.collisionBitMask = whatever
    wall.physicsBody?.collisionBitMask = whatever
    wall.physicsBody?.contactTestBitMask = whatever
  }

如果您设置为 nil 然后恢复它,请确保您在 gameLoop 的开始或结束时执行此操作。

在 gameScene 中的任一覆盖方法中

override func update(_ currentTime: TimeInterval) {

}

override func didFinishUpdate() {

}

希望对您有所帮助

您已经有了答案,但另一种方法可能是将 SKSpriteNode 子class 与一个额外的 属性 称为 inactivePhysicsBody(或类似),这是一个 'SKPhysicsBody' .

当你想要'turn off'该节点的物理时,将inactivePhysicsBody 属性设置为physicsBody,然后将physicsBody设置为nil.然后您可以在必要时轻松恢复物理体。

或者您可以向新 class 添加方法来执行相同的操作:

wall.activatePhysicsBody()
wall.inactPhysicsBody()

首选方法是从节点树中物理移除墙。这将提高性能,因为系统不必检查不必要的节点。

只需确保在移除墙时保留了墙,以便在需要时可以重新添加它。

wall[location].removeFromParent()    

...

scene.addChild(wall[location])

给拥有精灵的对象一个'extra'精灵物理体的引用,例如:

init(sprite: SKSpriteNode) {
    self.sprite = sprite
    self.physicsBody = sprite.physicsBody
    super.init()
}

然后您可以将 self.sprite.physicsBody 设置为 self.physicsBodynil 以打开/关闭对象的物理特性。就个人而言,我会避免在这里进行子类化,但 YMMV。