SpriteKit中的磨砂玻璃效果?

Posted

技术标签:

【中文标题】SpriteKit中的磨砂玻璃效果?【英文标题】:Frosted glass effect in SpriteKit? 【发布时间】:2014-07-06 15:31:26 【问题描述】:

我正在尝试为我的游戏中的节点添加磨砂玻璃效果。例如http://bit.ly/1vNMvAG 这样做的正确方法是什么?

【问题讨论】:

模糊过滤器会产生类似link 的效果,但我需要模糊节点后面的所有内容。类似“模糊蒙版”的东西。 @CHBuckingham 我需要模糊节点后面的场景。在模糊白色纹理时我不会得到这种效果。 @CHBuckingham 这说明了区别:link 或者我不明白你的意思? 删除 cmets 并在答案中一步一步。 【参考方案1】:

我一定是遗漏了一些东西,因为我会按照原始 cmets 中的建议留在 SpriteKit,但也许我会接受教育并学习新的东西。 :-) EDIT,简化了一切,现在您可以通过将裁剪蒙版设置为属性来移动裁剪蒙版,然后随时动态更改其位置。显然你可以用不同的精灵层来增加它的活力。

SKSpriteNode *bgImage = [SKSpriteNode spriteNodeWithImageNamed:@"bgImage.png"];
bgImage.anchorPoint = CGPointZero;
[self addChild:bgImage];

cropMaskNode = [SKSpriteNode spriteNodeWithImageNamed:@"clippingImage.png"];

SKCropNode *cropNode = [SKCropNode node];

SKSpriteNode *bgInsideOfCrop = [SKSpriteNode spriteNodeWithImageNamed:@"bgImage.png"];
bgInsideOfCrop.anchorPoint = CGPointZero;
SKEffectNode *effectNode = [SKEffectNode node];
effectNode.filter = [self blurFilter];
effectNode.shouldEnableEffects = YES;
effectNode.shouldCenterFilter = YES;
effectNode.shouldRasterize = YES;

[self addChild: cropNode];
[effectNode addChild:bgInsideOfCrop];
[cropNode addChild:effectNode];
cropNode.maskNode = cropMaskNode;

【讨论】:

不幸的是,这不起作用。我只看到透明节点。 如果你不帮自己,我帮不了你。上面的代码效果很好。我不知道“只看到透明节点是什么意思”。但听起来你错过了一步。 我需要类似 ios7 的效果。 UIKit中有UIToolbar,我可以使用CALayer来改变它的形状,但是把它和SpriteKit混合起来是不现实的。 听起来你还是一头雾水。我不能再回到 cmets 了。我花时间为您提供了一个非常棒的逐步解决方案。你可以定制它,但你希望你的模糊效果加上一个可选的磨砂层看起来。祝你好运。 :-) 我认为这是正确的方法,感谢发布!【参考方案2】:

据我所知,此效果仅在 ios 7 中可用。 Engin Kurutepe 已将其发布在 Github

- (void)willMoveToSuperview:(UIView *)newSuperview

    [super willMoveToSuperview:newSuperview];
    if (newSuperview == nil) 
        return;
    
    UIGraphicsBeginImageContextWithOptions(newSuperview.bounds.size, YES, 0.0);
    [newSuperview drawViewHierarchyInRect:newSuperview.bounds afterScreenUpdates:YES];
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIImage *croppedImage = [UIImage imageWithCGImage:CGImageCreateWithImageInRect(img.CGImage, self.frame)];
    UIGraphicsEndImageContext();

    self.backgroundImage = [croppedImage applyBlurWithRadius:11
                                                   tintColor:[UIColor colorWithWhite:1 alpha:0.3]
                                       saturationDeltaFactor:1.8
                                                   maskImage:nil];

Code Sample Ref

【讨论】:

更新:如果您没有使用 ios 7 sdk,请查看 ***.com/questions/11601166/… 但它适用于 UIView。如何为 SKSpriteNode 应用模糊? 我想解决方法是做类似 var overlay = UIView(new RectangleF(0,0, 100, 100)); overlay.AddSubviews(...) 谢谢!我添加了模糊的 UIImage 作为 SKSpriteNode 的纹理,效果很好。 @user3785463 太好了!知道一定有办法!

以上是关于SpriteKit中的磨砂玻璃效果?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免 SpriteKit 中的平滑效果?

Silverlight 2.0中的Vista玻璃效果

.net - C# 2.0 应用程序中的玻璃效果

在 Spritekit 中扩展圆形切口过渡效果

实现毛玻璃效果

使用 SpriteKit 的 Node 路径粒子效果