2014-11-23 2 views
5

У меня есть несколько игровых объектов в моей игре iOS, некоторые из которых имеют большее разрешение, чем другие. Графика, используемая для игрового объекта, выбирается случайным образом во время выполнения. Я хотел бы, чтобы убедиться, что все они не идут в течение определенного размера при использовании, поэтому я разработал следующий алгоритм:Калибровка и масштабирование SKSpriteNode

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

где spriteNode является объектом, текстура является графическим и rSize является расширенным вычисленное свойство на SKSpriteNode, которое возвращает размер накопленного кадра узла.

Часто это приводит к бесконечному циклу. В чем проблема?

UPDATE 1

Основываясь на комментарий LearnCocos2D, я попытался следующие:

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

Хотя это решает проблему бесконечного цикла, некоторые объекты сплющенные, а не держать их исходное соотношение сторон.

Кроме того, вот код, который определяет rSize:

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

Я использовал это надежно несколько раз.

+1

Было бы полезно, если бы вы разместили код, определяющий rSize. – 0x141E

+1

Вау, это ужасный код, вы можете просто получить требуемый масштабный коэффициент из соотношения между фактическим и желаемым размером и назначить результат. Цикл while будет блокировать программу некоторое время (или если у вас есть ошибка, как в этом случае: навсегда). Также рассмотрите соотношение сторон, вы можете обновить масштаб x/y отдельно. – LearnCocos2D

+0

Почему накопленный фрейм? Если узлы не имеют дочерних элементов, то они идентичны фрейму. Если у него есть дети, он не будет масштабировать контент спрайта до нового размера, а также общий размер спрайта и его детей. – LearnCocos2D

ответ

4

Я смог выяснить это. Я использую случайную ширину, потому что это то, что мне нужно.

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

Как нарисовать объект с ровной шириной 60 пикселей? Он рисуется с огромным размером –

Смежные вопросы