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) }