2014-11-23 17 views
5

Mam wiele obiektów gier w mojej grze na iOS, z których niektóre mają większą rozdzielczość niż inne. Grafika używana w grze jest wybierana losowo w środowisku wykonawczym. Chciałbym, aby upewnić się, że wszystkie one nie idą na pewną wielkość, kiedy używany, więc wymyślił następujący algorytm:Rozmiar i skalowanie SKSpriteNode

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

gdzie spriteNode jest obiekt, którego struktura jest graficzny i rsize jest rozszerzoną obliczona właściwość w SKSpriteNode, która zwraca rozmiar zgromadzonej ramki węzła.

Często powoduje to nieskończoną pętlę. Jaki jest problem?

UPDATE 1

podstawie komentarzu LearnCocos2D za próbowałem następujące:

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

Choć to rozwiązuje nieskończoną problem pętli, niektóre obiekty są spłaszczony niż utrzymanie ich oryginalnych proporcji.

Również tutaj jest kod, który określa rsize:

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

przed Użyłem tego niezawodnie wiele razy.

+1

Byłoby pomocne, gdyby opublikowano kod definiujący rSize. – 0x141E

+1

wow, to jest straszny kod, można po prostu uzyskać wymagany współczynnik skali ze stosunku między rzeczywistym i pożądanym rozmiarem i przypisać wynik. Pętla while blokuje program tylko na chwilę (lub jeśli masz błąd jak w tym przypadku: na zawsze). Uwzględnij także współczynnik proporcji, możesz chcieć zaktualizować skalę x/y osobno. – LearnCocos2D

+0

dlaczego the accumulatedFrame? Jeśli węzły nie mają żadnych dzieci, jest to identyczne z ramką. Jeśli ma dzieci, nie skaluje zawartości sprite'a do nowego rozmiaru, ale do całkowitej wielkości sprite'a i jego dzieci. – LearnCocos2D

Odpowiedz

4

Udało mi się to rozgryźć. Używam losowej szerokości, ponieważ tego właśnie wymagam.

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

jak narysować obiekt o dokładnie 60px szerokości? Jest rysowany z ogromnym rozmiarem –