如何使用sprite工具包在iOS中创build一个alpha蒙版

我试图达到的效果是在黑暗的地方有一圈光。 这个效果和小宠物游戏中的效果类似,当你在一个黑暗的洞穴里,只有你周围的视野有限。 从我已经尝试和阅读的内容来看,我一直无法在具有alpha级别的精灵套件中的节点上创build掩码。 我设法制作的面具都有很强的优势,而且基本上只是裁剪而已。 阅读关于具有maskNode属性的SKCropNode的苹果开发者页面,它说:“如果掩码中的像素具有小于0.05的alpha值,则图像像素被掩盖掉。 这不幸听起来像像素将被完全遮蔽或完全包括在内,没有alpha值。 如果我想说的话很难说,下面是我所取得的成果: https : //www.dropbox.com/s/y5gbk8qvuq4ynh0/iOS%20Simulator%20Screen%20shot%20Jan%2020%2C %202014%201.06.23%20 PM.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。

另外,为了清楚起见,如果有人感到困惑,黑色就是场景的背景颜色,图片在最上面,然后圆圈就是掩模节点的一部分。

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

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

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

使用一个单独的sprite节点和png作为你想要的每个灯光,并把它们全部添加到一个SKEffectNode或SKCropNode节点。 既然它们都在一个单独的上下文中呈现,这并不重要。 将每个精灵节点设置为屏幕混合模式。

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

最后,放映会很好地将“灯光”合并在一起,而放大将使白色区域透明。