我正在尝试在 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
兄弟节点不可屏蔽(例如SKLabelNode
s)
这不是理想状态。
灵感来自 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/