如何使用sprite工具包在iOS中创建alpha蒙版

时间:2014-01-20 19:17:05

标签: ios objective-c mask alpha sprite-kit

我想要达到的效果是在黑暗区域有一圈光。这种效果类似于口袋妖怪游戏,当你在一个黑暗的洞穴中,只有有限的视野围绕着你。根据我的尝试和阅读,我无法在具有alpha级别的sprite工具包中的节点上创建掩码。我设法创造的面具都有硬边,基本上只是裁剪。在Apple开发者页面上阅读有关具有maskNode属性的SKCropNode,它说“如果掩码中的像素的alpha值小于0.05,则图像像素被屏蔽掉。”不幸的是,这听起来像像素将被完全掩盖或完全包含在内,其间没有alpha值。如果我想说的话很难理解,那么这就是我所取得的成就: https://www.dropbox.com/s/y5gbk8qvuq4ynh0/iOS%20Simulator%20Screen%20shot%20Jan%2020%2C%202014%201.06.23%20PM.png

这是我想要实现的目标的图像: https://www.dropbox.com/s/wtwfdi1mjs2n8e6/iOS%20Simulator%20Screen%20shot%20Jan%2020%2C%202014%201.05.54%20PM.png

我设法得到上述结果的方式是,我掩盖了硬边缘圈,然后只添加了一个渐变的图像,从外面的黑色到内部的透明。这种方法不起作用的原因是因为我需要有多个圆圈,并且用我刚刚提到的方法,当圆圈相交时,可以看到透明圆圈外面的黑暗。

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

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。

另外,为了清楚地表明任何人感到困惑,黑色只是场景的背景色,图片位于其上方,然后圆圈就是遮罩节点的一部分。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我有一个想法......我希望它会有所帮助。

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

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

然后,在将父SKEffectNode或SKCropNode添加到场景时,将其设置为乘法混合模式。

最后,放映将合并"灯"很好地,乘法将使白色区域透明。