2015-02-26 20 views
6

Sono curioso di una situazione in cui mi sono imbattuto oggi cercando di annullare l'archiviazione e copiare uno SKSpriteNode da un SKScene a un altro. In uscita dal parco giochi di seguito si può vedere che sia linearDamping e angularDamping o non essere mantenuta dopo la copia (che sembrano essere cadere di nuovo a valori di default)Come copiare SKSpriteNode con SKPhysicsBody?

// 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 

GIOCO DI USCITA enter image description here

Sono non sono sicuro che sto copiando questo correttamente, sia SKSpriteNode sia SKPhysicsBody conformi a NSCopying Se si guarda l'output sopra la proprietà area viene mantenuta dopo la copia e, a quanto mi risulta, si basa sul size specificato quando SKPhysicsBody è stata creata.

Qualcuno può fare un po 'di luce su questo e forse fornirmi un puntatore su come dovrei fare una copia profonda di SKSpriteNode?

+2

Sembra un possibile bug. [Ne hai registrato uno] (http://bugreport.apple.com)? Hai provato a copiare separatamente il corpo fisico? – rickster

+0

Salve, proverò a fare la fisica Body copy e quindi invierò un bug report se fallisce anche tu. Non l'avevo ancora segnalato perché volevo essere sicuro che non mi mancasse qualcosa di ovvio prima di sprecare tempo a Mele. Molto apprezzato, signore. – fuzzygoat

+0

Se creo solo un singolo SKPhysicsBody e provo a copiarlo (sto usando un parco giochi) ottengo un SIGABRT, quindi qualcosa non è assolutamente adatto. Cercherò il sito Apple e invierò un bug. – fuzzygoat

risposta

10

prendo un modo per risolvere il problema, probabilmente non è il modo migliore, ma

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

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

per risolvere questo problema, ho creato un'estensione, e @mogelbuster suggerito di override predefinito copy(), formica sembra grande .

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

Con questa estensione si può fare, il metodo predefinito copy() ritorno Any perché questo è necessario lanci a 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 

IMAGE

+1

Ottima risposta! Un'estensione su SKSpriteNode è sicuramente la strada da percorrere. Sarebbe meglio sovrascrivere il metodo originale 'copy()' e richiamare l'implementazione di 'super' (come negli inizializzatori) invece di creare un nuovo metodo' copyWithPhysicsBody() '? – mogelbuster

+0

@mogelbuster Ho modificato la risposta in base al tuo suggerimento. È una bella osservazione, mi è piaciuto questo cambiamento. Grazie per l'osservazione. – ViTUu

+0

stranamente questo ** non funziona ** .. – Fattie