!!! Извините за такой длинный ответ, в нижней части вы можете найти полное решение как в Swift и Objective-C
Вы можете изменить цвет SKSpriteNode с анимацией, которая будет выглядеть лучше, используя этот подход :
Objective-C:
SKAction *changeColorAction = [SKAction colorizeWithColor:[SKColor blueColor] colorBlendFactor:1.0 duration:0.5];
[myLabel runAction:changeColorAction];
Свифта:
let changeColorAction = SKAction.colorizeWithColor(SKColor.blueColor(), colorBlendFactor: 1.0, duration: 0.5)
playerBar.runAction(changeColorAction)
Вот полное решение в Swift для вашей проблемы, с проверкой касания, сравнением цвета и изменением. На самом деле ваш метод проверки того, соответствует ли текущий цвет узла SKColor, не подходит. Итак, я показываю вам свое решение для этого, что может быть не очень здорово, но работает.
Прежде всего, где вы инициализировать узел Плеербара Sprite, дайте ему имя, как:
playerBar.name = "playerBar"
После, используйте код, приведенный ниже для сравнения SKColor (не очень точно, но в этом случае работает) и а также для отслеживания изменений узлов и цветов.
func isEqualColor(color: SKColor, toColor: SKColor) -> Bool {
let color1Components = CGColorGetComponents(color.CGColor)
let color2Components = CGColorGetComponents(toColor.CGColor)
if ((color1Components[0] != color2Components[0]) || //red
(color1Components[1] != color2Components[1]) || //green
(color1Components[2] != color2Components[2]) || //blue
(color1Components[3] != color2Components[3])) { //alpha
return false
}
return true
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
/* Called when a touch begins */
for touch: AnyObject in touches {
let location = touch.locationInNode(self)
let nodes = self.nodesAtPoint(location) as [SKNode]
for node in nodes {
if node.name == "playerBar" {
let spriteNode = node as SKSpriteNode
var color = SKColor.redColor()
if isEqualColor(spriteNode.color, toColor: SKColor.redColor()) {
color = SKColor.blueColor()
} else if isEqualColor(spriteNode.color, toColor: SKColor.blueColor()) {
color = SKColor.blackColor()
}
let changeColorAction = SKAction.colorizeWithColor(color, colorBlendFactor: 1.0, duration: 0.5)
spriteNode.runAction(changeColorAction) {
spriteNode.color = color //On completion of action, we set color so after in comparison method not have conflicts while comparing color components
}
}
}
}
}
Я не мог оставить вас без решения Obejctive-C для этого :) Так же вам нужно дать имя для вас Плеербар SpriteNode при инициализации.
playerBar.name = "playerBar";
И после того, как использовать эти методы для вашего полного решения:
- (BOOL)isEqualColor:(SKColor *)color1 toColor:(SKColor *)color2
{
const CGFloat* color1Components = CGColorGetComponents([color1 CGColor]);
const CGFloat* color2Components = CGColorGetComponents([color2 CGColor]);
if ((color1Components[0] != color2Components[0]) || //red
(color1Components[1] != color2Components[1]) || //green
(color1Components[2] != color2Components[2]) || //blue
(color1Components[3] != color2Components[3])) { //alpha
return NO;
}
return YES;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
/* Called when a touch begins */
for (UITouch *touch in touches) {
CGPoint location = [touch locationInNode:self];
NSArray *nodes = [self nodesAtPoint:location];
for (SKNode *node in nodes) {
if ([node.name isEqualToString:@"playerBar"]) {
SKSpriteNode *spriteNode = (SKSpriteNode *)node;
SKColor *color = [SKColor redColor];
if ([self isEqualColor:spriteNode.color toColor:[SKColor redColor]]) {
color = [SKColor blueColor];
} else if ([self isEqualColor:spriteNode.color toColor:[SKColor blueColor]]) {
color = [SKColor blackColor];
}
SKAction *changeColor = [SKAction colorizeWithColor:color colorBlendFactor:1.0 duration:0.5];
[spriteNode runAction:changeColor completion:^{
spriteNode.color = color; //On completion of action, we set color so after in comparison method not have conflicts while comparing color components
}];
}
}
}
}