Swift 如何使用SKPhysicsBody复制SkSpritEndode?

Swift 如何使用SKPhysicsBody复制SkSpritEndode?,swift,sprite-kit,copy,skspritenode,skphysicsbody,Swift,Sprite Kit,Copy,Skspritenode,Skphysicsbody,我很好奇今天在尝试将SKSpriteNode从一个SKScene复制到另一个SKSpriteNode时遇到的情况。在下面游乐场的输出中,您可以看到linearDamping和angularldamping在复制后都没有得到维护(它们似乎正在回落到默认值) 游乐场产量 我不确定我复制的是否正确,SKSpriteNode和SKPhysicsBody都符合NSCopying的要求,如果查看复制后维护区域属性上方的输出,据我所知,这是基于创建SKPhysicsBody时指定的大小 有谁能解释一下这一点

我很好奇今天在尝试将
SKSpriteNode
从一个
SKScene
复制到另一个
SKSpriteNode
时遇到的情况。在下面游乐场的输出中,您可以看到
linearDamping
angularldamping
在复制后都没有得到维护(它们似乎正在回落到默认值)

游乐场产量

我不确定我复制的是否正确,
SKSpriteNode
SKPhysicsBody
都符合
NSCopying
的要求,如果查看复制后维护
区域
属性上方的输出,据我所知,这是基于创建
SKPhysicsBody
时指定的
大小


有谁能解释一下这一点,并向我提供一个指针,说明我应该如何深入复制
SKSpriteNode

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

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

   ...
   //COPY PHYSICS BODY HARD MODE
   spriteCopy.physicsBody = physicsCopy;
为了解决这个问题,我创建了一个扩展,@mogelbuster建议覆盖default
copy()
,听起来不错

extension SKSpriteNode
{
    override open func copy() -> Any {
        let node = super.copy() as! SKSpriteNode;
        node.physicsBody = super.physicsBody;
        return node;
    }
}
使用此扩展可以执行此操作,默认的
copy()
方法返回
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

看起来可能是个bug?你试过单独复制物理体吗?嗨,我会尝试复制物理体,如果失败的话,我会提交一份错误报告。我还没有报告这件事,因为我想在浪费时间之前确保我没有遗漏一些明显的东西。非常感谢,先生。如果我只创建一个SKPhysicsBody并尝试复制它(我使用的是一个游乐场),我会得到一个SIGABRT,所以这里肯定有问题。我将搜索苹果网站并提交一个bug。除了Rickster之外,没有人评论过我,我已经按照他的建议做了,并向苹果提交了一个bug#20003803很好的答案!在SKSpriteNode上进行扩展肯定是一个不错的选择。重写原始的
copy()
方法并调用
super
的实现(如在初始化程序中)是否比创建新的
copyWithPhysicsBody()
方法更好?@mogelbuster我根据您的提示更改了答案。这是一个很好的观察,我喜欢这个变化。感谢您的观察。@Fattie您无论如何都不想这样做,这并没有复制
SKPhysicsBody
,它只是将复制节点的物理体分配给现有的
SKPhysicsBody
,我猜它要么崩溃,或者不使用
SKPhysicsBody
保留原始代码,我猜这家伙的原始三行代码(最上面)真的会复制它-但是是的:/By“不起作用”,我的意思是“不复制属性值”(我猜)您可能希望他们在这里使用NSCopy…您不应该覆盖swift扩展中的属性/函数,您应该阅读文档。
// 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