【问题标题】:SpriteKit, copying a physics body does NOT copy the settings?SpriteKit,复制物理体不会复制设置?
【发布时间】:2018-04-03 06:55:31
【问题描述】:

这似乎令人难以置信,但是,

let pb = model.physicsBody?.copy() as! SKPhysicsBody
print("orig .. \(model.physicsBody!.linearDamping)")
print("pb .. \(pb.linearDamping)")

它们不一样。真的没有。

这太奇怪了,我一定是做错了什么。我做错了什么?

除了手动复制所有属性并随着代码的发展而永久维护代码之外,如何做到这一点??


如果有人需要,这里有一个 dupe-qualities 功能,可以节省打字。 (这是 2017 年的——当然,随着 Apple 不断增加品质,它必须永远保持下去。)

extension SKSpriteNode
{
    func dupe() -> Any {

        // annoyingly, Apple does not provide a dupe function as you would use
        // when spawning from a model.

        let c = self.copy() as! SKSpriteNode

        c.physicsBody = self.physicsBody!.copy() as? SKPhysicsBody

        c.physicsBody?.affectedByGravity = self.physicsBody!.affectedByGravity
        c.physicsBody?.allowsRotation = self.physicsBody!.allowsRotation
        c.physicsBody?.isDynamic = self.physicsBody!.isDynamic

        c.physicsBody?.pinned = self.physicsBody!.pinned

        c.physicsBody?.mass = self.physicsBody!.mass
        c.physicsBody?.density = self.physicsBody!.density
        c.physicsBody?.friction = self.physicsBody!.friction
        c.physicsBody?.restitution = self.physicsBody!.restitution
        c.physicsBody?.linearDamping = self.physicsBody!.linearDamping
        c.physicsBody?.angularDamping = self.physicsBody!.angularDamping

        c.physicsBody?.categoryBitMask = self.physicsBody!.categoryBitMask
        c.physicsBody?.collisionBitMask = self.physicsBody!.collisionBitMask
        c.physicsBody?.fieldBitMask = self.physicsBody!.fieldBitMask
        c.physicsBody?.contactTestBitMask = self.physicsBody!.contactTestBitMask

        return c
    }
}

(只是一个人的意见,我觉得最好不要仅仅覆盖 NSCopy,因为整个事情是一个敏感的问题,为了下一位工程师,最好简单明了。这是很常见的“将游戏对象的品质欺骗”另一个游戏对象,所以,这很好。)

【问题讨论】:

  • 这与 SKPhysicsBody 作为 PKPhysicsBody 的包装类有关,他们执行得很差,SKPhysicsBody 在哪里复制,但它创建了一个新的 PKPhysicsBody。您也许可以扩展和覆盖复制功能来修复它
  • 无论如何很高兴知道,事实上,它不会复制值,它不会克隆:/ 我想这就是生活
  • 我注意到 iOS 中物理体的另一个问题是,你不能仅仅在类别之间“改变”(体积/边缘等)。这不是不合理的,但实际上,对我来说,在那种情况下,他们将它们归为同一类是非常令人困惑的。它应该只是 SKPhysicsBody(即“A body”)和 SKPhysicsTrigger - 或它们拥有的任何其他东西。
  • 这里没有错字,PKPhysicsBody 来自PhysicsKit,这是一个我们无法访问的私有框架。 SKPhysicsBody 创建一个 PKPhysicsBody 实体,所以当你复制时。它正在创建一个新的PKPhysicsBody 实体,而不是复制现有的。
  • 啊!请原谅我没有注意到 P - 谢谢,太棒了

标签: swift sprite-kit skspritenode skphysicsbody spawning


【解决方案1】:

这与 SKPhysicsBodyPKPhysicsBody 的包装类有关

本质上,当您创建SKPhysicsBody 的副本时,它会创建PKPhysicsBody 的新实例,而不是它的副本。

要解决这个问题,您需要编写一个为您填充值的扩展:

extension SKPhysicsBody
{
    override open func copy() -> Any {
        guard let body = super.copy() as? SKPhysicsBody else {fatalError("SKPhysicsBody.copy() failed")}
        body.affectedbyGravity = affectedByGravity
        body.allowsRotation= allowsRotation
        body.isDynamic= isDynamic
        body.mass= mass
        body.density = density
        body.friction = friction
        body.restitution = restitution
        body.linearDamping = linearDamping
        body.angularDamping = angularDamping

        return body
    }
}

注意,我是手动输入的,目前我没有可用的 XCode 来测试它是否有效。

【讨论】:

  • 很高兴知道事实的答案是,Apple 在这种情况下不会进行深度复制。好一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 2016-05-15
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多