Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使SKSpriteNode闪烁为白色_Objective C_Macos_Sprite Kit_Skspritenode_Fragment Shader - Fatal编程技术网

Objective c 使SKSpriteNode闪烁为白色

Objective c 使SKSpriteNode闪烁为白色,objective-c,macos,sprite-kit,skspritenode,fragment-shader,Objective C,Macos,Sprite Kit,Skspritenode,Fragment Shader,我试着让雪碧变成白色,就像它受到伤害一样。这将涉及通过SKAction控制某些参数。首先,我尝试将SKCropNode与白色SKShapeNode结合使用,但我不认为我完全理解它是如何工作的,因为它没有做任何事情。我的第二次尝试是给雪碧上色,但我发现当你给雪碧上色时,它只会显示它原来的颜色。我相信着色器可以工作,但我对它们没有太多经验。有什么想法吗 [编辑] 好的,在阅读了一百万个关于这个主题的网站之后,我发现了以下内容,即SKCropNodes只对SKSpriteNodes起作用(用于掩蔽等)

我试着让雪碧变成白色,就像它受到伤害一样。这将涉及通过SKAction控制某些参数。首先,我尝试将SKCropNode与白色SKShapeNode结合使用,但我不认为我完全理解它是如何工作的,因为它没有做任何事情。我的第二次尝试是给雪碧上色,但我发现当你给雪碧上色时,它只会显示它原来的颜色。我相信着色器可以工作,但我对它们没有太多经验。有什么想法吗

[编辑]

好的,在阅读了一百万个关于这个主题的网站之后,我发现了以下内容,即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];
}];

我想出来了。下面是我编写的类的重要部分来处理这个问题…忽略类的名称…这是我的应用程序特有的东西,只需根据需要调用它:

VersusImage.h

#import <SpriteKit/SpriteKit.h>

@interface VersusImage : SKSpriteNode


-(instancetype) initWithImage:(SKSpriteNode*)image;
-(void) flashWhite;

@end

由于混合的工作原理,使用颜色操作着色在这里不会有帮助:尝试制作一个命中状态图像(完全白色图像)。这将是最简单的解决办法。然后只需交换纹理,在一定延迟后来回切换。或者,如果你需要动画,可以使用两个精灵并快速淡入/淡出命中状态纹理……有没有办法用SKCropNode实现这一点?这将是理想的,这样我就不必对每个精灵有两个不同的版本。不能马上说什么是性能或优雅的解决方案,但它可能是可行的。如果你用你迄今为止尝试过的方法更新你的问题,也许有人能帮助你……我理解。我在上面添加了一些代码和代码生成的图像…这不完全是我想要的。
#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