swift - SpriteKit 并以编程方式绘制简单图形

标签 swift sprite-kit swift2

关于使用 SpriteKit 渲染引擎的任何建议,但能够以编程方式绘制游戏图形。这些图形很简单,但比矩形和椭圆形稍微复杂一些。

我最近发现 SKShapeNode 在使用自定义路径时对复杂性有上限。我基本上有一个函数,它采用数字生成随机 CGPath 形状,数字越大,形状越复杂和越详细。当我使用较小的数字时,没有问题,但是当我使用较大的数字生成更复杂的路径时,SKShapeNode 给我这个错误。 (我也在真机上用 iOS9.2.1 测试过)

Assertion failed: (length + offset <= _length)

Related Question

现在我不认为使用 SKShapeNode 是个好主意,所以关于以编程方式绘制能够很好地与 SpriteKit 一起工作的图形有什么建议吗?

我在其他地方读到它是使用任何可用的图形 API 绘制的,只要它可以转换为 SKTexture 可以初始化的格式,这是正确的方法吗?

最佳答案

如果您将使用 SKTexture,您可以使用 CGContext 绘制图表。

首先,您需要创建图表点数组,例如:

let pathPoints: [CGPoint] = [...] 

然后您需要调用 UIGraphicsBeginImageContext(rect.size) 其中 rect.sizeCGSize 对象,它决定了区域的大小它将刻在图表上,rectCGRect 对象。下一步是创建 CGContextRef 并设置它:

UIGraphicsBeginImageContext(size)
let context: CGContextRef = UIGraphicsGetCurrentContext()!
CGContextSetStrokeColorWithColor(context, UIColor.redColor().CGColor);
CGContextSetLineWidth(context, lineWidth)

其中lineWidthCGFloat类型的值。

在此之后,您可以像这样在上下文中创建图表:

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/

相关文章:

ios - How to indent documentation in appledoc/HeaderDoc(关于带参数的 block 的文档)

ios - didMoveToSuperview 中调用的 UIView.animate 意外影响所有 subview

ios - 更改部署目标后无法再将应用程序模块导入单元测试

ios - Deinit 方法在初始化其实例并将委托(delegate)设置为某个 View Controller 时自动调用

swift - 沿路径的节点轨迹,如 hello world

从 C 调用 Swift

ios - 第二次加载 View Controller 时,UITableView reloadData 不起作用

ios - SpriteKit - Objective C - 相机约束

swift - 使用 Swift 在向下循环中移动 SKSpriteNode

ios - 为什么 Swift 2 更喜欢强制解包而不是可选值?