Серьезная ошибка SpriteKit UIColor на iPhone 5S

При работе с SKSpriteNodes и их цветами я обнаружил серьезную быструю ошибку в SpriteKit.

Этот код отлично работает на всех iPhone, кроме iPhone 5S:

var color1 = UIColor(red: 123/255, green: 123/255, blue: 123/255, alpha: 1)
var color2 = UIColor(red: 123/255, green: 123/255, blue: 123/255, alpha: 1)

var sprite = SKSpriteNode(color: color1, size: CGSizeMake(100, 100))

if(sprite.color == color2){
     println("Same color")
}

Как видите, два цвета абсолютно одинаковы. Но на симуляторе iPhone 5S if не вызывается.

Есть ли у кого-то еще такая же проблема и может предложить решение?


person Christian    schedule 15.09.2014    source источник


Ответы (2)


Согласно документации здесь:

Sprite Kit работает только со сплошными цветами. Для достижения наилучших результатов используйте предустановленные цвета, предоставленные классом платформы, или пользовательский цвет, определенный в цветовом пространстве устройства RGBA.

В результате каким-то образом SKSpriteNode внес некоторые изменения в параметр color в функции инициализации. Вы можете увидеть это, если вызовете encode:

sprite.color.encode() // 140,646,370,382,768

color1.encode() // 140,646,367,110,928

Если вы используете предопределенные значения цвета, ваша проблема исчезнет:

var color3 = UIColor.blueColor()
var sprite3 = SKSpriteNode(color: color3, size: CGSizeMake(100, 100))

sprite3.color == color3 // true
person Anthony Kong    schedule 16.09.2014

Вы сравниваете значения указателя, а не фактический цвет. Видя, что это экземпляры UIColor, вы должны сравнить их, используя isEqual (показывая код ObjC, поскольку я не знаю, как он выглядит в Swift, или, возможно, Swift фактически использует isEqual за кулисами):

if ([sprite.color isEqual:color2])

При правильной реализации с помощью UIColor это будет сравнивать фактические значения цвета, а не указатели.

person LearnCocos2D    schedule 16.09.2014