如何在用户触摸时更改精灵颜色

时间:2014-12-08 21:21:02

标签: ios sprite-kit 2d-games

我是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];
}

任何人都可以帮助我吗? 非常感谢。

3 个答案:

答案 0 :(得分:5)

!!!很抱歉这么长的答案,在底部你可以在Swift和Objective-C中找到完整的解决方案

您可以使用此方法更改带有动画效果的SKSpriteNode的颜色:

目标-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的方法是不行的。所以我告诉你我的解决方案,这可能不是很好,但是很有效。

首先,在初始化playerBar 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解决方案,我不能离开你:) 所以你需要在初始化时为你的playerBar 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
          }];
        }
      }
    }
}

答案 1 :(得分:0)

假设你正确地注册了触摸,你必须为playerBar分配一个colorBlendFactor

playerBar.colorBlendFactor = 1.0;

colorBlendFactor是一个浮点值,描述颜色如何与精灵的纹理混合。

答案 2 :(得分:-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];
    }
}