Как дублировать спрайт с физическими свойствами, а затем добавить его в сцену?

#swift #sprite-kit #skspritenode #skphysicsbody

#swift #sprite-kit #skspritenode #skphysicsbody

Вопрос:

В моем редакторе сцен есть спрайт под названием «redsprite» с некоторыми физическими свойствами. Я действительно хочу использовать этот спрайт для следующего.

Я хотел бы «дублировать» этот спрайт, сохраняя его физические свойства, но с новой позицией.

 let sprite:SKSpriteNode = (self.childNode(withName: "redsprite") as! SKSpriteNode).copyWithPhysicsBody()
sprite.position = CGPoint(x:100,y:100)
self.addChild(sprite)
  

Я использую расширение SKSpriteNode для копирования спрайта.

 extension SKSpriteNode  {
    func copyWithPhysicsBody()->SKSpriteNode {
       let node = self.copy() as! SKSpriteNode
       node.physicsBody = self.physicsBody
       return node
    }
}
  

У меня эта классическая ошибка:

 Terminating app due to uncaught exception 'Cant add body, already exists in a world', reason: 'Cant add body <SKPhysicsBody> type:<Rectangle> representedObject:[<SKSpriteNode> name:'redsprite' texture:['nil'] position:{100, 100} scale:{1.49, 1.40} size:{149.15391540527344, 140.06228637695312} anchor:{0.5, 0.5} rotation:0.00], already exists in a world'
  

Я понял ошибку, она очень понятна, но я не нахожу способа ее избежать.

Ответ №1:

Вы берете исходное тело и размещаете его на 2 узлах. Вы не можете этого сделать.

Насколько я помню, physicsBody теперь копируется в команде копирования (это было не всегда). Таким образом, вам не нужно переносить исходное тело. Если он не копирует, то сделайте:

node.physicsBody = self.physicsBody.copy()

Комментарии:

1. невероятно, но он НЕ копирует настройки physicsBody, когда вы делаете глубокую копию, кажется. (конец 2017) Как смешно.