使 SKSpriteNode 闪烁白色
Make A SKSpriteNode Flash White
我正在尝试让精灵闪烁白色,就像它受到伤害时一样。这将涉及通过 SKAction 控制某些参数。首先,我尝试将 SKCropNode 与白色 SKShapeNode 结合使用,但我不认为我完全理解它是如何工作的,因为它什么也没做。我的第二次尝试是给精灵上色,但我发现当你给精灵上色时,它只会显示它原来的颜色。我确信着色器可以工作,但我对它们没有太多经验。有什么想法吗?
[编辑]
好的,在阅读了关于这个主题的一百万个网站之后,我遇到了以下 SO question,它说 SKCropNodes 只能与 SKSpriteNodes 一起使用(用于掩蔽等)。所以我更新了我的代码并允许我的精灵变成白色。我以为我可以 运行 一个 SKAction 来调低白色 SKSpriteNode 上的 alpha 以显示遮罩节点,但这只会让整个精灵消失。所以我想也许我可以将原始图像添加到 SKCropNode,但是白色的 SKSpriteNode 消失了。我决定创建一个 SKAction 来调暗白色的 SKSpriteNode,然后将原始节点添加到 SKCropNode。可以,但是有更好的方法吗?
SKSpriteNode *prod = [SKSpriteNode spriteNodeWithImageNamed:@"some image"];
[prod setSize:CGSizeMake(prod.frame.size.width*0.2, prod.frame.size.height*0.2)];
prod.zPosition = -1;
SKSpriteNode *mask = [SKSpriteNode spriteNodeWithImageNamed:@"some image"];
[mask setSize:CGSizeMake(mask.frame.size.width*0.2, mask.frame.size.height*0.2)];
mask.zPosition = 1;
//mask.position = CGPointMake(300, 300);
SKSpriteNode *shape = [SKSpriteNode spriteNodeWithColor:[NSColor whiteColor] size:CGSizeMake(800, 600)];
shape.zPosition = 2;
SKCropNode *cropNode = [SKCropNode node];
cropNode.maskNode = mask;
[cropNode addChild:shape];
//[cropNode addChild:prod];
cropNode.position = CGPointMake(300, 300);
[self addChild:cropNode];
SKAction *fadeOut = [SKAction fadeAlphaTo:0 duration:0.1];
[shape runAction:fadeOut completion:^{
[cropNode addChild:prod];
}];
我明白了。这是我为处理此问题而编写的 class 的重要部分...忽略 class 的名称...这是我的应用程序特有的内容,您可以随意调用它:
VersusImage.h
#import <SpriteKit/SpriteKit.h>
@interface VersusImage : SKSpriteNode
-(instancetype) initWithImage:(SKSpriteNode*)image;
-(void) flashWhite;
@end
VersusImage.m
#import "VersusImage.h"
@interface VersusImage()
@property SKCropNode *cropNode;
@property SKSpriteNode *image;
@property SKSpriteNode *shape;
@end
@implementation VersusImage
-(instancetype) initWithImage:(SKSpriteNode*)image {
if (self = [super init]) {
_image = image;
[self initImage];
}
return self;
}
-(void) initImage {
_image.zPosition = -1;
_image.alpha = 1;
float width = _image.frame.size.width, height = _image.frame.size.height;
SKTexture *texture = [_image texture];
SKSpriteNode *mask = [SKSpriteNode spriteNodeWithTexture:texture size:CGSizeMake(width, height)];
mask.zPosition = 1;
_shape = [SKSpriteNode spriteNodeWithColor:[NSColor whiteColor] size:CGSizeMake(width, height)];
_shape.zPosition = 2;
_shape.alpha = 0;
_cropNode = [SKCropNode node];
_cropNode.maskNode = mask;
[_cropNode addChild:_shape];
[_cropNode addChild:_image];
[self addChild:_cropNode];
}
-(void) flashWhite {
SKAction *showWhite = [SKAction fadeAlphaTo:1.0 duration:0];
SKAction *hideImage = [SKAction fadeAlphaTo:0 duration:0];
SKAction *fadeOut = [SKAction fadeAlphaTo:0 duration:0.2];
SKAction *fadeIn = [SKAction fadeAlphaTo:1 duration:0.2];
[_shape runAction:[SKAction sequence:@[showWhite, fadeOut]]];
[_image runAction:[SKAction sequence:@[hideImage, fadeIn]]];
}
@end
我正在尝试让精灵闪烁白色,就像它受到伤害时一样。这将涉及通过 SKAction 控制某些参数。首先,我尝试将 SKCropNode 与白色 SKShapeNode 结合使用,但我不认为我完全理解它是如何工作的,因为它什么也没做。我的第二次尝试是给精灵上色,但我发现当你给精灵上色时,它只会显示它原来的颜色。我确信着色器可以工作,但我对它们没有太多经验。有什么想法吗?
[编辑]
好的,在阅读了关于这个主题的一百万个网站之后,我遇到了以下 SO question,它说 SKCropNodes 只能与 SKSpriteNodes 一起使用(用于掩蔽等)。所以我更新了我的代码并允许我的精灵变成白色。我以为我可以 运行 一个 SKAction 来调低白色 SKSpriteNode 上的 alpha 以显示遮罩节点,但这只会让整个精灵消失。所以我想也许我可以将原始图像添加到 SKCropNode,但是白色的 SKSpriteNode 消失了。我决定创建一个 SKAction 来调暗白色的 SKSpriteNode,然后将原始节点添加到 SKCropNode。可以,但是有更好的方法吗?
SKSpriteNode *prod = [SKSpriteNode spriteNodeWithImageNamed:@"some image"];
[prod setSize:CGSizeMake(prod.frame.size.width*0.2, prod.frame.size.height*0.2)];
prod.zPosition = -1;
SKSpriteNode *mask = [SKSpriteNode spriteNodeWithImageNamed:@"some image"];
[mask setSize:CGSizeMake(mask.frame.size.width*0.2, mask.frame.size.height*0.2)];
mask.zPosition = 1;
//mask.position = CGPointMake(300, 300);
SKSpriteNode *shape = [SKSpriteNode spriteNodeWithColor:[NSColor whiteColor] size:CGSizeMake(800, 600)];
shape.zPosition = 2;
SKCropNode *cropNode = [SKCropNode node];
cropNode.maskNode = mask;
[cropNode addChild:shape];
//[cropNode addChild:prod];
cropNode.position = CGPointMake(300, 300);
[self addChild:cropNode];
SKAction *fadeOut = [SKAction fadeAlphaTo:0 duration:0.1];
[shape runAction:fadeOut completion:^{
[cropNode addChild:prod];
}];
我明白了。这是我为处理此问题而编写的 class 的重要部分...忽略 class 的名称...这是我的应用程序特有的内容,您可以随意调用它:
VersusImage.h
#import <SpriteKit/SpriteKit.h>
@interface VersusImage : SKSpriteNode
-(instancetype) initWithImage:(SKSpriteNode*)image;
-(void) flashWhite;
@end
VersusImage.m
#import "VersusImage.h"
@interface VersusImage()
@property SKCropNode *cropNode;
@property SKSpriteNode *image;
@property SKSpriteNode *shape;
@end
@implementation VersusImage
-(instancetype) initWithImage:(SKSpriteNode*)image {
if (self = [super init]) {
_image = image;
[self initImage];
}
return self;
}
-(void) initImage {
_image.zPosition = -1;
_image.alpha = 1;
float width = _image.frame.size.width, height = _image.frame.size.height;
SKTexture *texture = [_image texture];
SKSpriteNode *mask = [SKSpriteNode spriteNodeWithTexture:texture size:CGSizeMake(width, height)];
mask.zPosition = 1;
_shape = [SKSpriteNode spriteNodeWithColor:[NSColor whiteColor] size:CGSizeMake(width, height)];
_shape.zPosition = 2;
_shape.alpha = 0;
_cropNode = [SKCropNode node];
_cropNode.maskNode = mask;
[_cropNode addChild:_shape];
[_cropNode addChild:_image];
[self addChild:_cropNode];
}
-(void) flashWhite {
SKAction *showWhite = [SKAction fadeAlphaTo:1.0 duration:0];
SKAction *hideImage = [SKAction fadeAlphaTo:0 duration:0];
SKAction *fadeOut = [SKAction fadeAlphaTo:0 duration:0.2];
SKAction *fadeIn = [SKAction fadeAlphaTo:1 duration:0.2];
[_shape runAction:[SKAction sequence:@[showWhite, fadeOut]]];
[_image runAction:[SKAction sequence:@[hideImage, fadeIn]]];
}
@end