如何用 SKPhysicsBody 复制 SKSpriteNode?
How to copy SKSpriteNode with SKPhysicsBody?
我很好奇我今天在尝试取消存档并将 SKSpriteNode
从一个 SKScene
复制到另一个时遇到的情况。在下面 playground 的输出中,您可以看到 linearDamping
和 angularDamping
或在复制后未被维护(它们似乎正在恢复为默认值)
// 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
游乐场输出
我不确定我是否正确复制了这个,SKSpriteNode
和 SKPhysicsBody
都符合 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
我很好奇我今天在尝试取消存档并将 SKSpriteNode
从一个 SKScene
复制到另一个时遇到的情况。在下面 playground 的输出中,您可以看到 linearDamping
和 angularDamping
或在复制后未被维护(它们似乎正在恢复为默认值)
// 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
游乐场输出
我不确定我是否正确复制了这个,SKSpriteNode
和 SKPhysicsBody
都符合 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