关于使用 SpriteKit 渲染引擎的任何建议,但能够以编程方式绘制游戏图形。这些图形很简单,但比矩形和椭圆形稍微复杂一些。
我最近发现 SKShapeNode
在使用自定义路径时对复杂性有上限。我基本上有一个函数,它采用数字生成随机 CGPath
形状,数字越大,形状越复杂和越详细。当我使用较小的数字时,没有问题,但是当我使用较大的数字生成更复杂的路径时,SKShapeNode
给我这个错误。 (我也在真机上用 iOS9.2.1 测试过)
Assertion failed: (length + offset <= _length)
现在我不认为使用 SKShapeNode
是个好主意,所以关于以编程方式绘制能够很好地与 SpriteKit 一起工作的图形有什么建议吗?
我在其他地方读到它是使用任何可用的图形 API 绘制的,只要它可以转换为 SKTexture
可以初始化的格式,这是正确的方法吗?
最佳答案
如果您将使用 SKTexture
,您可以使用 CGContext
绘制图表。
首先,您需要创建图表点数组,例如:
let pathPoints: [CGPoint] = [...]
然后您需要调用 UIGraphicsBeginImageContext(rect.size)
其中 rect.size
是 CGSize
对象,它决定了区域的大小它将刻在图表上,rect
是 CGRect
对象。下一步是创建 CGContextRef
并设置它:
UIGraphicsBeginImageContext(size)
let context: CGContextRef = UIGraphicsGetCurrentContext()!
CGContextSetStrokeColorWithColor(context, UIColor.redColor().CGColor);
CGContextSetLineWidth(context, lineWidth)
其中lineWidth
是CGFloat
类型的值。
在此之后,您可以像这样在上下文中创建图表:
if pathPoints.count > 1 {
CGContextMoveToPoint(context, pathPoints.first!.x, pathPoints.first!.y)
for var i = 1; i < pathPoints.count; ++i {
CGContextAddLineToPoint(context, pathPoints[i].x, pathPoints[i].y)
}
}
CGContextStrokePath(context)
然后你需要像这样创建图像表单上下文:
let image = UIGraphicsGetImageFromCurrentImageContext()
然后创建纹理形式 image
并将其用于将添加到场景中的 SKSpriteNode
对象:
let pathTexture = SKTexture(image: image)
let pathNode = SKSpriteNode(texture: pathTexture)
pathNode.position = CGPointMake(rect.origin.x + rect.width/2 - lineWidth/2, rect.origin.y + rect.height/2 - lineWidth/2)
pathNode.zPosition = 0
someParrentNodeThatOnScene.addChild(pathNode)
UIGraphicsEndImageContext()
这就是创建图表所需的全部内容。
关于swift - SpriteKit 并以编程方式绘制简单图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35145679/