带图像的SKSpriteNode不会着色

时间:2014-02-28 06:27:07

标签: ios objective-c sprite-kit

我创建了一个SKSpriteNode,如下所示:

 //Easy Button Image

_easyImage = [[SKSpriteNode alloc]initWithImageNamed:@"smiley.png"];
_easyImage.position = CGPointMake(-20,screenHeight / 2);
_easyImage.name = easyBtnName;
_easyImage.physicsBody.affectedByGravity = NO;
_easyImage.zPosition = 10;

[self addChild:_easyImage];

我试图在触摸开始方法中点击后对图像进行着色。我有一个对SKSpriteNode属性的引用,所以一旦我看到它被单击,我执行此代码

        SKAction *pulseRed = [self colorizeChoosenSpriteNodeWithColor:[SKColor redColor]];
        [_easyImage runAction: pulseRed];

参考此方法

    -(SKAction*)colorizeChoosenSpriteNodeWithColor:(SKColor*)color
     {
SKAction *changeColorAction = [SKAction colorizeWithColor:color  colorBlendFactor:1.0 duration:0.3];
SKAction *waitAction = [SKAction waitForDuration:0.2];
SKAction *selectAction = [SKAction sequence:@[changeColorAction, waitAction]];
return selectAction;
      }

但是,我的图像颜色永远不会改变。我可以完全改变图像的纹理,但我不能只改变颜色。

编辑:我删除了一些分散注意力的代码。我调试了代码,它肯定正确执行,但我没有得到预期的结果。

更新:颜色出现在我发现的图像下方。

Same code except one has a missing image. Red color shows on the Sprite Node with the missing image?

左侧图片显示缺失图像,右侧图片显示正确图像。仅在未显示图像时才显示颜色。我怎样才能真正着色spriteNode纹理?

2 个答案:

答案 0 :(得分:1)

我认为你在触摸开始方法中缺少一个for循环。你的触摸开始方法应该是这样的:

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
     for (UITouch *touch in touches) {   
     if ([node.name isEqualToString:easyBtnName]){
         _easyImage.color = [SKColor redColor];
         _easyImage.colorBlendFactor = 1;
         SKAction *pulseRed = [self colorizeChoosenSpriteNodeWithColor:[SKColor redColor]];
    [_easyImage runAction: pulseRed];
    } }
    }

答案 1 :(得分:0)

您可以这样设置颜色

func changeColor() -> UIColor{
  var color:UIColor
  switch (arc4random_uniform(6)) {
    case 0:
      color = UIColor.purpleColor()
    case 1:
      color = UIColor.blueColor()
    case 2:
      color = UIColor.yellowColor()
    case 3:
      color = UIColor.magentaColor()
    case 4:
      color = UIColor.greenColor()
    default:
      color = UIColor.redColor()
  }
  return color
}

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) 
{
  let colorAction = SKAction.colorizeWithColor(self.changeColor(), colorBlendFactor: 1, duration: 1)
  SKSpriteNode.runAction(colorAction)
}

它对我有用。祝你好运!