如何使用sprite工具包在iOS中创建alpha掩码

如何使用sprite工具包在iOS中创建alpha掩码,ios,objective-c,mask,alpha,sprite-kit,Ios,Objective C,Mask,Alpha,Sprite Kit,我试图达到的效果是在黑暗的区域有一个光圈。这种效果类似于口袋妖怪游戏中的效果,当你在一个黑暗的洞穴中,周围只有有限的视野。根据我的尝试和阅读,我无法在精灵套件中的节点上创建具有alpha级别的遮罩。我设法制作的面具都有硬边,基本上只是裁剪。在apple开发者页面上读到关于SKCropNode的内容,它具有maskNode属性,它说“如果掩码中的像素的alpha值小于0.05,则图像像素被遮罩。”不幸的是,这听起来像是像素要么被完全遮罩,要么被完全包含,两者之间没有alpha值。如果我想说的很难理

我试图达到的效果是在黑暗的区域有一个光圈。这种效果类似于口袋妖怪游戏中的效果,当你在一个黑暗的洞穴中,周围只有有限的视野。根据我的尝试和阅读,我无法在精灵套件中的节点上创建具有alpha级别的遮罩。我设法制作的面具都有硬边,基本上只是裁剪。在apple开发者页面上读到关于SKCropNode的内容,它具有maskNode属性,它说“如果掩码中的像素的alpha值小于0.05,则图像像素被遮罩。”不幸的是,这听起来像是像素要么被完全遮罩,要么被完全包含,两者之间没有alpha值。如果我想说的很难理解,以下是我所取得成就的图像:

以下是我想要实现的目标:

我设法得到上述结果的方法是,我屏蔽了硬边圆,然后添加了一个从外部黑色到内部透明的渐变图像。这种方法不起作用的原因是我需要有多个圆,用我刚才提到的方法,当圆与黑暗相交时,可以看到透明圆的外侧

总之,我需要的是一种方法,使一个圆的中心开始变暗,然后逐渐消失。然后,在圆圈较暗的地方,可以看到圆圈后面的图像,在圆圈透明的地方,看不到圆圈后面的图像。再一次,如果我说的话很难理解,我很抱歉。这是我正在使用的代码。其中一些是从其他帖子中发现的

SKSpriteNode *background = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(500, 500)];
    background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));

    SKCropNode *cropNode = [[SKCropNode alloc] init];
    SKNode *area = [[SKNode alloc] init];

    int x = 65; //radius of the circle

    _circleMask = [[SKShapeNode alloc ]init];
    CGMutablePathRef circle = CGPathCreateMutable();
    CGPathAddArc(circle, NULL, 0, 0, x/2, 0, M_PI*2, YES);
    _circleMask.path = circle;
    _circleMask.lineWidth = x*2;
    _circleMask.strokeColor = [SKColor whiteColor];
    _circleMask.name=@"circleMask";
    _circleMask.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));

//Here is where I just added in the gradient circle To give the desired appearance, but this isn't necessary to the code
    //_circleDark = [SKSpriteNode spriteNodeWithImageNamed:@"GradientCircle"];
    //_circleDark.position = [cropNode convertPoint:_circleMask.position fromNode:area];

    [area addChild:_circleMask];

    [cropNode setMaskNode:area];
    [cropNode addChild:background];
    //[cropNode addChild:_circleDark];

    [self addChild:cropNode];
这种方法还允许我移动圆圈,显示它后面图像的不同部分,这就是我想要的。为此,我只需将其设置为在用户点击屏幕时更改_circleMask.position


另外,为了明确这一点,以防任何人感到困惑,黑色只是场景的背景色,图片位于背景色之上,然后圆圈是遮罩节点的一部分。

一个非常简单的(可能更少…或更高性能)这个版本将是简单地在顶部添加一个SKSpriteNode,在透明的背景上有你们的小插曲。换句话说,如果在Photoshop中查看,当您从中心向外移动时,您将看到圆圈中可见的棋盘格数量减少,最终显示为纯黑色。在应用程序中使用PNG图像时,合成两个精灵时将保留此透明度。

我有一个想法。。。我希望这会有帮助

用你想要的从白色到黑色的渐变制作一个PNG,没有透明度

对所需的每个灯光使用带有png的单独精灵节点,并将它们全部添加到SKEffectNode或SKCropNode节点。哪一个都不重要,因为它们都是在单独的上下文中呈现的。将每个精灵节点设置为屏幕混合模式

然后,将父SKEffectNode或SKCropNode添加到场景时,将其设置为“倍增混合”模式


最后,屏幕将很好地将“灯光”合并在一起,而倍增将使白色区域透明。

我已经尝试过类似于您所说的内容。问题是我需要多个“光”的圆,所以我不能让一个图像的中心有一个圆在移动,因为如果有多个圆,它们需要独立移动。如果我让它们独立移动,当它们相交时看起来是这样的:你可能想看看SKEffectNode。性能上的损失相当大,但您可能会找到一些工作正常但不太沉重的东西。请看:中的“使用图像掩码屏蔽图像”部分:这正是我所需要的,如果有人能够找到如何将其应用于节点而不仅仅是图像。您找到了吗?