2014-12-08 1 views
0

Я новичок в разработке iOS и SpriteKit. Я делаю игру, и мне нужно изменить цвет спрайта, когда пользователь прикасается к нему. На самом деле, у меня есть три определенных цвета. Спрайт начинается с красного цвета. Когда пользователь прикасается к нему, он становится синим. Если пользователь коснется снова, он становится черным. И если пользователь коснется его еще раз, он снова станет красным.Как изменить цвет спрайта при нажатии на него

В touchbegan методе я пытаюсь что-то вроде:

if (playerBar.color == [SKColor redColor]) { 
    playerBar.color = [SKColor blueColor]; 
} else if (playerBar.color == [SKColor blueColor] { 
    playerBar.color = [SKColor blackColor]; 
} else if (playerBar.color == [SKColor blackColor]) { 
    playerBar.color = [SKColor redColor]; 
} 

Любой человек может мне помочь? Большое спасибо.

ответ

0

при условии, что вы регистрирующие штрихи правильно, вы должны назначить Плеербар colorBlendFactor

playerBar.colorBlendFactor = 1.0; 

colorBlendFactor является значение с плавающей точкой, которая описывает, как цвет смешивается с текстурой спрайта.

5

!!! Извините за такой длинный ответ, в нижней части вы можете найти полное решение как в 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 
      }]; 
     } 
     } 
    } 
} 
-2
-(void)changeColor 
{ 
    int color = 1; 

    if (color == 1 || color > 3) { 
     playerBar.color = [SKColor redColor]; 
     color = 1; 
    }if else(color == 2) { 
     playerBar.color = [SKColor blueColor]; 
    }if else(color == 3) { 
     playerBar.color = [SKColor blackColor]; 
    } 

    color++; 
} 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchLocation = [touch locationInNode:self.scene]; 
    SKNode *node = [self nodeAtPoint:touchLocation]; 
    if ([node.name isEqualToString:@"yourSpriteName"]) { 
     [self changeColor]; 
    } 
} 
Смежные вопросы