有没有一种简单的方法可以暂时禁用 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.physicsBody
或 nil
以打开/关闭对象的物理特性。就个人而言,我会避免在这里进行子类化,但 YMMV。
我正在制作一个迷宫应用程序,它会在完成一个迷宫后生成一个新的迷宫。显然,我可以通过执行我在代码 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.physicsBody
或 nil
以打开/关闭对象的物理特性。就个人而言,我会避免在这里进行子类化,但 YMMV。