如何使用 SpriteKit 绘制实心圆?
How do I draw a filled circle using SpriteKit?
我正在尝试在 SpriteKit 中绘制一个实心圆。
我目前正在画一个圆圈。
node.physicsBody = SKPhysicsBody(circleOfRadius: radius)
node.fillColor = color
node.strokeColor = node.fillColor
我需要根据 0.0 到 1.0 之间的值在特定级别填充此圆。我怎样才能达到这个效果?
例如,上面的圆圈填充值为0.5。
我建议您使用 CoreGraphics 中的方法以编程方式绘制图像:
UIGraphicsBeginImageContextWithOptions(size, false, 1)
//your code to draw the shape here
let imageYouWant = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
然后使用imageYouWant
作为你的SKSpriteNode
的图片
我只有时间给你部分答案。正如 Carrl 所说,您可以使用 Core Graphics 绘制您正在寻找的形状(除了我使用构建在它之上的 UIBezierPath):
UIGraphicsBeginImageContextWithOptions(CGSizeMake(100, 100), false, 0)
UIColor.greenColor().set()
let p = UIBezierPath()
p.moveToPoint(CGPointMake(0, 50))
p.addArcWithCenter(CGPointMake(50, 50), radius: 50, startAngle: 0, endAngle: CGFloat(M_PI), clockwise: true)
p.closePath()
p.fill()
p.removeAllPoints()
p.moveToPoint(CGPointMake(0, 50))
UIColor.greenColor().colorWithAlphaComponent(0.5).set()
p.addArcWithCenter(CGPointMake(50, 50), radius: 50, startAngle: CGFloat(M_PI), endAngle: CGFloat(2 * M_PI), clockwise: true)
p.closePath()
p.fill()
let im1 = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
您仍然需要弄清楚如何将其用作 SKSpriteNode
中的纹理,但您应该能够在此站点上找到答案。 (SKShapeNode
可能 是一个选项,但上次我尝试在 Swift 游乐场中使用它时,我记得它在尝试填充形状节点时抛出了一个错误路径。)
实现此目的的一种方法是使用 SKCropNode
首先你需要创建两个圆形纹理,像这样;
然后创建自定义 SKSpriteNode
:
import SpriteKit
class Circle : SKSpriteNode {
var fillSprite : SKSpriteNode!
var cropNode : SKCropNode!
var maskNode : SKSpriteNode!
override init(texture: SKTexture?, color: UIColor, size: CGSize) {
super.init(texture: texture, color: color, size: size)
fillSprite = SKSpriteNode(imageNamed: "bluecircle")
maskNode = SKSpriteNode(color: UIColor.blackColor(), size: CGSize(width: self.size.width, height: self.size.height))
maskNode.position.y -= self.size.height/2
cropNode = SKCropNode()
cropNode.addChild(fillSprite)
cropNode.maskNode = maskNode
cropNode.zPosition = 1
self.addChild(cropNode)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setFillAmount(amount: CGFloat) {
// amount parameter must be float value between 0.0 and 1.0
let newHeight = amount * (self.size.height*2)
maskNode.size = CGSize(width: self.size.width, height: newHeight)
}
}
要使用这个:
// Image size is 150x150px in this example
let circle = Circle(texture: SKTexture(imageNamed: "whitecircle"), color: UIColor.whiteColor(), size: CGSize(width: 150, height: 150))
circle.setFillAmount(0.4)
就是这样。
也许不是完美的解决方案,但可以作为开始。至少它有效。
我正在尝试在 SpriteKit 中绘制一个实心圆。
我目前正在画一个圆圈。
node.physicsBody = SKPhysicsBody(circleOfRadius: radius)
node.fillColor = color
node.strokeColor = node.fillColor
我需要根据 0.0 到 1.0 之间的值在特定级别填充此圆。我怎样才能达到这个效果?
例如,上面的圆圈填充值为0.5。
我建议您使用 CoreGraphics 中的方法以编程方式绘制图像:
UIGraphicsBeginImageContextWithOptions(size, false, 1)
//your code to draw the shape here
let imageYouWant = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
然后使用imageYouWant
作为你的SKSpriteNode
我只有时间给你部分答案。正如 Carrl 所说,您可以使用 Core Graphics 绘制您正在寻找的形状(除了我使用构建在它之上的 UIBezierPath):
UIGraphicsBeginImageContextWithOptions(CGSizeMake(100, 100), false, 0)
UIColor.greenColor().set()
let p = UIBezierPath()
p.moveToPoint(CGPointMake(0, 50))
p.addArcWithCenter(CGPointMake(50, 50), radius: 50, startAngle: 0, endAngle: CGFloat(M_PI), clockwise: true)
p.closePath()
p.fill()
p.removeAllPoints()
p.moveToPoint(CGPointMake(0, 50))
UIColor.greenColor().colorWithAlphaComponent(0.5).set()
p.addArcWithCenter(CGPointMake(50, 50), radius: 50, startAngle: CGFloat(M_PI), endAngle: CGFloat(2 * M_PI), clockwise: true)
p.closePath()
p.fill()
let im1 = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
您仍然需要弄清楚如何将其用作 SKSpriteNode
中的纹理,但您应该能够在此站点上找到答案。 (SKShapeNode
可能 是一个选项,但上次我尝试在 Swift 游乐场中使用它时,我记得它在尝试填充形状节点时抛出了一个错误路径。)
实现此目的的一种方法是使用 SKCropNode
首先你需要创建两个圆形纹理,像这样;
然后创建自定义 SKSpriteNode
:
import SpriteKit
class Circle : SKSpriteNode {
var fillSprite : SKSpriteNode!
var cropNode : SKCropNode!
var maskNode : SKSpriteNode!
override init(texture: SKTexture?, color: UIColor, size: CGSize) {
super.init(texture: texture, color: color, size: size)
fillSprite = SKSpriteNode(imageNamed: "bluecircle")
maskNode = SKSpriteNode(color: UIColor.blackColor(), size: CGSize(width: self.size.width, height: self.size.height))
maskNode.position.y -= self.size.height/2
cropNode = SKCropNode()
cropNode.addChild(fillSprite)
cropNode.maskNode = maskNode
cropNode.zPosition = 1
self.addChild(cropNode)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setFillAmount(amount: CGFloat) {
// amount parameter must be float value between 0.0 and 1.0
let newHeight = amount * (self.size.height*2)
maskNode.size = CGSize(width: self.size.width, height: newHeight)
}
}
要使用这个:
// Image size is 150x150px in this example
let circle = Circle(texture: SKTexture(imageNamed: "whitecircle"), color: UIColor.whiteColor(), size: CGSize(width: 150, height: 150))
circle.setFillAmount(0.4)
就是这样。
也许不是完美的解决方案,但可以作为开始。至少它有效。