objective-c - 是否可以在 Sprite Kit 中使用圆形 (SKShapeNode) 作为 mask ?

标签 objective-c iphone ios7 sprite-kit skcropnode

我正在尝试在 Sprite Kit 项目中创建一个圆形 mask 。我像这样创建圆圈(将其定位在屏幕的中心):

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

SKShapeNode *circleMask = [[SKShapeNode alloc ]init];
CGMutablePathRef circle = CGPathCreateMutable();
CGPathAddArc(circle, NULL, CGRectGetMidX(self.frame), CGRectGetMidY(self.frame), 50, 0, M_PI*2, YES);
circleMask.path = circle;
circleMask.lineWidth = 0;
circleMask.fillColor = [SKColor blueColor];
circleMask.name=@"circleMask";

在代码的更下方,我将其设置为 cropNode 的掩码:

[cropNode setMaskNode:circleMask];

...但不是内容显示在圆圈内,掩码显示为正方形。

是否可以使用 SKShapeNode 作为 mask ,或者我是否需要使用图像?

最佳答案

经过多次咒骂、搜索网络和在 Xcode 中进行实验后,我找到了一个非常 hacky 的修复方法。

请记住,这是一个非常讨厌的 hack - 但您可以将其归咎于 Sprite Kit 的 SKShapeNode 实现。向路径添加填充会导致以下情况:

  • 向您的场景添加一个额外的节点
  • 路径变得不可掩蔽——它出现在掩码“之上”
  • 使任何非SKSpriteNode 兄弟节点不可屏蔽(例如SKLabelNodes)

这不是理想状态。

灵感来自 Tony Chamblee's progress timer ,“修复”是完全放弃填充,只使用路径的笔触:

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

SKShapeNode *circleMask = [[SKShapeNode alloc ]init];
CGMutablePathRef circle = CGPathCreateMutable();
CGPathAddArc(circle, NULL, CGRectGetMidX(self.frame), CGRectGetMidY(self.frame), 50, 0, M_PI*2, YES); // replace 50 with HALF the desired radius of the circle
circleMask.path = circle;
circleMask.lineWidth = 100; // replace 100 with DOUBLE the desired radius of the circle
circleMask.strokeColor = [SKColor whiteColor];
circleMask.name=@"circleMask";

[cropNode setMaskNode:circleMask];

如评论所述,您需要将半径设置为正常半径的一半,并将线宽设置为半径的两倍。

希望 Apple 将来会关注这一点;目前,这个 hack 是我找到的最好的解决方案(除了使用图像,如果您的蒙版需要动态,它就不会真正起作用)。

关于objective-c - 是否可以在 Sprite Kit 中使用圆形 (SKShapeNode) 作为 mask ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20228943/

相关文章:

iphone - NSString @"\"添加反斜杠字符 objective-c

iphone - iOS 上的 "Terminating app due to uncaught exception"

iphone - 如何开发具有混响功能的iPhone应用程序?

iOS7 截屏预防/检测

ios - 为自定义 UINavigationBar 设置委托(delegate)

iphone - 核心数据和 iPhone 的 NSDecimalNumber 问题

iphone - NSNotificationCenter 无法在通用应用程序的 iPhone 端工作

ios - 如何将正确的 NavigationItem 添加到具有根 viewController 的 navigationViewController

ios - 更新到 iOS 7.1 后,tabBar 图像消失了

objective-c - 同一日期的 NSDate 和 NSDateComponent 值之间的差异