如何用 SKPhysicsBody 复制 SKSpriteNode?

How to copy SKSpriteNode with SKPhysicsBody?

我很好奇我今天在尝试取消存档并将 SKSpriteNode 从一个 SKScene 复制到另一个时遇到的情况。在下面 playground 的输出中,您可以看到 linearDampingangularDamping 或在复制后未被维护(它们似乎正在恢复为默认值)

// PLAYGROUND_SW1.2 - SKSpriteNode Copy
import UIKit
import SpriteKit

// ORIGINAL
let spriteNode = SKSpriteNode()
spriteNode.name = "HAPPY_NODE"
let size = CGSize(width: 55.0, height: 150.0)
let physics = SKPhysicsBody(rectangleOfSize: size)
physics.linearDamping = 0.123
physics.angularDamping = 0.456
spriteNode.physicsBody = physics

// COPY
let spriteCopy = spriteNode.copy() as! SKSpriteNode

// ORIGINAL
spriteNode.name
spriteNode.physicsBody?.linearDamping
spriteNode.physicsBody?.angularDamping
spriteNode.physicsBody?.area

// COPY
spriteCopy.name
spriteCopy.physicsBody?.linearDamping
spriteCopy.physicsBody?.angularDamping
spriteCopy.physicsBody?.area

游乐场输出

我不确定我是否正确复制了这个,SKSpriteNodeSKPhysicsBody 都符合 NSCopying 如果您查看 area 属性 在复制后保留,据我所知,这是基于创建 SKPhysicsBody 时指定的 size

任何人都可以对此有所了解,并可能为我提供有关我应该如何深度复制 SKSpriteNode 的指示吗?

我采取一种方法来解决你的问题,可能不是最好的方法,但是

   //COPY
   let spriteCopy = spriteNode.copy() as SKSpriteNode
   let physicsCopy:SKPhysicsBody = spriteNode.physicsBody!;

   ...
   //COPY PHYSICS BODY HARD MODE
   spriteCopy.physicsBody = physicsCopy;

为了解决这个问题,我创建了一个扩展,@mogelbuster 建议覆盖默认 copy(),听起来不错。

extension SKSpriteNode
{
    override open func copy() -> Any {
        let node = super.copy() as! SKSpriteNode;
        node.physicsBody = super.physicsBody;
        return node;
    }
}

有了这个扩展你可以做到,默认的 copy() 方法 return Any 因为你需要转换为 SKSpriteNode.

// COPY
let spriteCopy = spriteNode.copy() as! SKSpriteNode;

// ORIGINAL
spriteNode.name
spriteNode.physicsBody?.linearDamping
spriteNode.physicsBody?.angularDamping
spriteNode.physicsBody?.area


// COPY
spriteCopy.name
spriteCopy.physicsBody?.linearDamping
spriteCopy.physicsBody?.angularDamping
spriteCopy.physicsBody?.area