SKSpriteNode – 创build一个圆angular节点?

有没有办法让一个SKSpriteNode圆angular? 我正在尝试用颜色填充的SKSpriteNode创build一个Tile likesqaure块:

SKSpriteNode *tile = [SKSpriteNode spriteNodeWithColor:[UIColor colorWithRed:0.0/255.0 green:128.0/255.0 blue:255.0/255.0 alpha:1.0] size:CGSizeMake(30, 30)]; 

我怎样才能使它圆滑?

谢谢!

要获得圆angular节点,您可以使用2种方法,每种方法都需要使用SKShapeNode。

第一种方法是使用SKShapeNode并将其path设置为如下所示的圆angular矩形:

 SKShapeNode* tile = [SKShapeNode node]; [tile setPath:CGPathCreateWithRoundedRect(CGRectMake(-15, -15, 30, 30), 4, 4, nil)]; tile.strokeColor = tile.fillColor = [UIColor colorWithRed:0.0/255.0 green:128.0/255.0 blue:255.0/255.0 alpha:1.0]; 

另一个使用精灵节点,裁剪节点和带有圆angular矩形的SKShapeNode作为裁剪节点掩码:

 SKSpriteNode *tile = [SKSpriteNode spriteNodeWithColor:[UIColor colorWithRed:0.0/255.0 green:128.0/255.0 blue:255.0/255.0 alpha:1.0] size:CGSizeMake(30, 30)]; SKCropNode* cropNode = [SKCropNode node]; SKShapeNode* mask = [SKShapeNode node]; [mask setPath:CGPathCreateWithRoundedRect(CGRectMake(-15, -15, 30, 30), 4, 4, nil)]; [mask setFillColor:[SKColor whiteColor]]; [cropNode setMaskNode:mask]; [cropNode addChild:tile]; 

如果你的瓷砖是一个纯色,我build议你去第一种方法。

在Swift 3中,你可以创build:

 let tile = SKShapeNode(rect: CGRect(x: 0, y: 0, width: 30, height: 30), cornerRadius: 10) 

希望这可以帮助:

 SKSpriteNode *make_rounded_rectangle(UIColor *color, CGSize size, float radius) { UIGraphicsBeginImageContext(size); [color setFill]; CGRect rect = CGRectMake(0, 0, size.width, size.height); UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius]; [path fill]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); SKTexture *texture = [SKTexture textureWithImage:image]; return [SKSpriteNode spriteNodeWithTexture:texture]; } 

这受到了接受的答案的启发,但是它使用了更可读的方式来创buildSKShapeNode ,并修复了作物周围烦人的像素线。 看起来像一个小细节,但它可能花费几分钟的人。

 CGFloat cornerRadius = 15; SKCropNode *cropNode = [SKCropNode node]; SKShapeNode *maskNode = [SKShapeNode shapeNodeWithRectOfSize:scoreNode.size cornerRadius:cornerRadius]; [maskNode setLineWidth:0.0]; [maskNode setFillColor:[UIColor whiteColor]]; [cropNode setMaskNode:maskNode]; [cropNode addChild:scoreNode]; 

这真的很简单…….

 class YourSprite: SKSpriteNode { func yourSetupFunction() { texture = SKTexture( image: UIImage(named: "cat")!.circleMasked! ) 

没有什么更多的了。

你真的不能使用 SKShapeNode。

就这么简单。 这是一个使用SKShapeNode的疯狂的性能打击,这不是正确的解决scheme,这是毫无意义的困难,SKShapeNode的目的与这个问题没有关系。

在这里输入图像说明

看看他们所有的小猫!

circleMasked的代码很简单:

(所有处理图像的项目都需要这个。)

 extension UIImage { var isPortrait: Bool { return size.height > size.width } var isLandscape: Bool { return size.width > size.height } var breadth: CGFloat { return min(size.width, size.height) } var breadthSize: CGSize { return CGSize(width: breadth, height: breadth) } var breadthRect: CGRect { return CGRect(origin: .zero, size: breadthSize) } var circleMasked: UIImage? { UIGraphicsBeginImageContextWithOptions(breadthSize, false, scale) defer { UIGraphicsEndImageContext() } guard let cgImage = cgImage?.cropping(to: CGRect(origin: CGPoint( x: isLandscape ? floor((size.width - size.height) / 2) : 0, y: isPortrait ? floor((size.height - size.width) / 2) : 0), size: breadthSize)) else { return nil } UIBezierPath(ovalIn: breadthRect).addClip() UIImage(cgImage: cgImage, scale: 1, orientation: imageOrientation) .draw(in: breadthRect) return UIGraphicsGetImageFromCurrentImageContext() } // classic 'circleMasked' stackoverflow fragment // courtesy Leo Dabius /a/29047372/294884 } 

这里的所有都是它的。

从类参考:

“SKSpriteNode是绘制纹理图像,彩色正方形或混合了颜色的纹理图像的节点。

看来最简单的方法是绘制一个圆angular块,然后使用这些类方法之一:

  • spriteNodeWithImageNamed:
  • spriteNodeWithTexture:
  • spriteNodeWithTexture:尺寸:

这是一个基于接受答案的第二个解决scheme的Swift 3片段。

 func createPlayerRoundedNode(){ let tile = SKSpriteNode(color: .white, size: CGSize(width: 30, height: 30)) tile.zPosition = 3 tile.name = "tile node" let cropNode = SKCropNode() cropNode.zPosition = 2 cropNode.name = "crop node" let mask = SKShapeNode(rect: CGRect(x: 0, y: 0, width: 30, height: 30), cornerRadius: 10) mask.fillColor = SKColor.darkGray mask.zPosition = 2 mask.name = "mask node" cropNode.maskNode = mask self.addChild(cropNode) cropNode.addChild(tile) }