我是iOS开发和SpriteKit的新手。我正在制作一个游戏,我需要在用户触摸它时更改精灵颜色。实际上,我有三种确定的颜色。角色以红色开始。当用户触摸它时,它会变成蓝色。如果用户再次触摸,它将变为黑色。如果用户再触摸它一次,它又变红了。
在触摸开始的方法中,我正在尝试类似的东西:
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];
}
有人可以帮助我吗?多谢。
!!很抱歉这么长的答案,在底部你可以找到 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.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 解决方案来解决这个问题:)因此,您需要在初始化时为您的玩家Bar 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
}];
}
}
}
}
假设您正确注册了触摸,则必须为玩家Bar分配一个colorBlendFactor
playerBar.colorBlendFactor = 1.0;
colorBlendFactor 是一个浮点值,用于描述颜色如何与精灵的纹理混合。
-(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];
}
}