首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SpriteKit中,SKCropNode对SKShapeNode无效

在SpriteKit中,SKCropNode对SKShapeNode无效
EN

Stack Overflow用户
提问于 2014-02-17 04:25:08
回答 3查看 2.8K关注 0票数 9

我一直在尝试使用SKCropNode将掩码应用到SKShapeNode上,但到目前为止还没有成功。我认为这是一个SpriteKit错误--下面是代码片段:

代码语言:javascript
复制
SKNode* contentNode = [SKNode node];

// picture - use an image bigger than 50x50
SKSpriteNode *pictureNode = [SKSpriteNode spriteNodeWithImageNamed:@"tree"];

// triangle
SKShapeNode* triangleNode = [SKShapeNode node];
UIBezierPath* triangleNodeBezierPath = [[UIBezierPath alloc] init];
[triangleNodeBezierPath moveToPoint:CGPointMake(0.0, 0.0)];
[triangleNodeBezierPath addLineToPoint:CGPointMake(0.0, 100.0)];
[triangleNodeBezierPath addLineToPoint:CGPointMake(50.0, 100.0)];
[triangleNodeBezierPath closePath];

triangleNode.path = triangleNodeBezierPath.CGPath;
triangleNode.fillColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1];

// create a mask
SKSpriteNode *mask = [SKSpriteNode spriteNodeWithColor:[SKColor blackColor] size: CGSizeMake(50, 50)]; //50 by 50 is the size of the mask

// create a SKCropNode
SKCropNode *cropNode = [SKCropNode node];

[cropNode addChild: contentNode];
[cropNode setMaskNode: mask];

[self addChild: cropNode];
[contentNode addChild:pictureNode]; // pictureNode is being cropped
[contentNode addChild:triangleNode]; // triangleNode is not

cropNode.position = CGPointMake( CGRectGetMidX (self.frame), CGRectGetMidY (self.frame));

有没有人有解决这个问题的办法?非常感谢!

EN

回答 3

Stack Overflow用户

发布于 2014-02-17 05:31:29

这已经困扰了我一天的大部分时间。我曾计划创建一个类似于优秀的TCProgressTimer by Tony Chamblee的计时器。但是,因为我的应用程序使用了多个进度计时器,所以我不想设计几十个不同大小的sprites来使用不同的分辨率。

我的解决方案是将SKShapeNode对象转换为SKSpriteNode对象。我最终不得不回到基础知识,并使用核心图形来做繁重的提升。我敢肯定,这是一种相当混乱的处理方式,但我想要快速的结果,以便动态地创建与使用SKShapeNode时获得的结果相似的对象。

目前我只对创建circle对象感兴趣,所以我是这样做的:

代码语言:javascript
复制
-(SKSpriteNode *)createSpriteMatchingSKShapeNodeWithRadius:(float)radius color:(SKColor *)color {
    CALayer *drawingLayer = [CALayer layer];
    CALayer *circleLayer = [CALayer layer];
    circleLayer.frame = CGRectMake(0,0,radius*2.0f,radius*2.0f);
    circleLayer.backgroundColor = color.CGColor;
    circleLayer.cornerRadius = circleLayer.frame.size.width/2.0;
    circleLayer.masksToBounds = YES;


    [drawingLayer addSublayer:circleLayer];

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(circleLayer.frame.size.width, circleLayer.frame.size.height), NO, [UIScreen mainScreen].scale);
    CGContextSetAllowsAntialiasing(UIGraphicsGetCurrentContext(), TRUE);
    CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(), [UIColor clearColor].CGColor);
    CGContextFillRect(UIGraphicsGetCurrentContext(), CGRectMake(0,0,circleLayer.frame.size.width,circleLayer.frame.size.height));
    [drawingLayer renderInContext: UIGraphicsGetCurrentContext()];

    UIImage *layerImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithTexture:[SKTexture textureWithImage:layerImage]];


    return sprite;
}

最终得到的精灵现在可以像预期的那样被SKCropNode屏蔽了。由于这些精灵都是在场景开始之前生成的,所以我没有注意到性能影响。但是,如果您要动态生成多个节点,我会认为这种方法的效率非常低。

我渴望听到其他用户的解决方案。希望这能有所帮助。

-DC

票数 9
EN

Stack Overflow用户

发布于 2015-02-24 16:33:43

我的应用程序中也有类似的任务。我需要根据用户输入绘制多个不规则形状,然后将它们用作裁剪节点的蒙版。

对我有效的解决方案是:

  1. 创建具有所需路径的SKShapeNode
  2. 使用SKView方法从中检索SKTexture textureFromNode:crop:
  3. 根据该纹理创建SKSpriteNode。
  4. 使用SKSprite节点作为掩码。<代码>H29<代码>G210
票数 5
EN

Stack Overflow用户

发布于 2014-10-25 08:46:07

你的标题是正确的。我还发现在CropNode的层次结构中有一个ShapeNode也会影响它上面的子节点。我做了一个快速实验。您可以创建一个新的游戏项目并亲自尝试。通过注释掉addChild:shapeContent行中的一行,您可以看到它如何影响宇宙飞船图像的裁剪。

正如DoctorClod指出的那样,当前的解决方案似乎是确保cropNode的所有子对象都是SpriteNodes。

代码语言:javascript
复制
-(void)didMoveToView:(SKView *)view {

SKSpriteNode* colorBackground = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(800, 600)];

SKSpriteNode *spaceshipImage = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];

SKShapeNode* shapeContent = [SKShapeNode shapeNodeWithRect:CGRectMake(0, 0, 200, 100)];
shapeContent.fillColor = [SKColor greenColor];

SKSpriteNode *maskShape  = [SKSpriteNode spriteNodeWithColor:[SKColor blackColor] size:CGSizeMake(500, 100)];

SKCropNode *cropNode = [SKCropNode new];

[cropNode addChild:colorBackground];
[cropNode addChild:shapeContent];     // comment this one out
[cropNode addChild:spaceshipImage];
[cropNode addChild:shapeContent];     // or comment this one out

[cropNode setMaskNode:maskShape];

cropNode.position = CGPointMake(CGRectGetMidX (self.frame), CGRectGetMidY(self.frame));
[self addChild:cropNode];
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21816079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档