2014-11-23 19 views
5

Ho più oggetti di gioco nel mio gioco iOS, alcuni dei quali hanno una risoluzione maggiore rispetto ad altri. La grafica da utilizzare per l'oggetto di gioco viene scelta casualmente in fase di esecuzione. Mi piacerebbe fare in modo che tutti non vanno oltre una certa dimensione quando viene utilizzato, così ho ideato il seguente algoritmo:Dimensionamento e ridimensionamento SKSpriteNode

while self.spriteNode.rSize.width > 100 && self.spriteNode.rSize.height > 100 { 
    self.xScale -= 0.01 
    self.yScale -= 0.01 
} 

dove spriteNode è l'oggetto di cui consistenza è la grafica e rsize è un esteso proprietà calcolata su SKSpriteNode che restituisce la dimensione del frame accumulato del nodo.

Spesso, questo si traduce in un ciclo infinito. Qual è il problema?

UPDATE 1

Basato sul commento di LearnCocos2D, ho provato quanto segue:

let reqXScale = 50/self.spriteNode.rSize.width 
let reqYScale = 50/self.spriteNode.rSize.height 
self.xScale = reqXScale 
self.yScale = reqYScale 

Anche se questo risolve il problema ciclo infinito, alcuni oggetti vengono schiacciati piuttosto che mantenere il loro rapporto di aspetto originale.

Inoltre, ecco il codice che definisce rsize:

var rSize: CGSize { 
    return self.calculateAccumulatedFrame().size 
} 

Ho usato questo in modo affidabile più volte prima.

+1

Sarebbe utile se hai pubblicato il codice che definisce rSize. – 0x141E

+1

wow questo è un codice terribile, puoi solo ricavare il fattore di scala richiesto dal rapporto tra la dimensione effettiva e quella desiderata e assegnare il risultato. Il ciclo while bloccherà solo il programma per un po '(o se hai un bug come in questo caso: per sempre). Considera anche le proporzioni, potresti aggiornare la bilancia x/y separatamente. – LearnCocos2D

+0

perché il campo cumulativo? Se i nodi non hanno figli, è identico al frame. Se ha figli, non ridimensiona il contenuto dello sprite alla nuova dimensione ma alla dimensione totale dello sprite E dei suoi figli. – LearnCocos2D

risposta

4

Sono stato in grado di capirlo. Sto usando una larghezza casuale perché è quello che richiedo.

// Scaling 
let aspectRatio = self.spriteNode.rSize.width/self.spriteNode.rSize.height 
let randWidth = CGFloat(rand(60, 90)) 
self.spriteNode.size = CGSize(width: randWidth, height: randWidth/aspectRatio) 
+0

come disegnare un oggetto con esattamente 60px di larghezza? È disegnato con una dimensione enorme –