如何在GameplayKit中显示GKPath

时间:2016-02-07 22:09:04

标签: ios swift sprite-kit gameplay-kit

有显示GKPath的技巧吗?

例如我的路径:

class ScenarioPath: GKPath {

    //SET
    //   |  |  |  |  |  |
    // --A--B--C--D--E--F--
    //   |  |  |  |  |  |
    //6 punti con raggio quasi 600 e lato 500 va bene per scenario 2K * 3K
    static let lato = Float(500.0)
    static let maxY = Float(0.0)
    static let radius : Float = 600.0

    static let maxYNormalize = maxY - radius

    static let pts = [
        vector_float2(-lato,maxYNormalize),
        vector_float2(+lato,maxYNormalize),
        vector_float2(-2*lato,maxYNormalize),
        vector_float2(+2*lato,maxYNormalize),
        vector_float2(-3*lato,maxYNormalize),
        vector_float2(+3*lato,maxYNormalize)]


    init () {
        super.init(points: UnsafeMutablePointer(ScenarioPath.pts), count: ScenarioPath.pts.count, radius: ScenarioPath.radius, cyclical: true)
    }


}

我正在寻找一个简单的函数来显示这条路径。 感谢

1 个答案:

答案 0 :(得分:1)

GameplayKit不是图形框架。它是一个低级工具包,可以与任何图形框架一起使用。它没有绘制GKPath的任何功能,因为至少有解释路径的方法与图形工具包和坐标系一样多。

由于您正在使用SpriteKit,因此CGPath使用与GKPath相同的一组点数并不太难,然后将其分配给SKShapeNode以放入你的场景。

您可以在两个较大的演示项目中找到Apple示例代码:AgentsCatalogDemoBots

这有点让你开始:

// BTW, vector_float2 just a typealias for float2,
// and is ArrayLiteralConvertible, so you can write your array shorter:
let pts: [float2] = [
    [-lato,maxYNormalize],
    [+lato,maxYNormalize],
    // ...
]

// CGPoint extension to make the conversion more readable and reusable
extension CGPoint {
    init(_ vector: float2) {
        self.init(x: CGFloat(vector.x), y: CGFloat(vector.y))
    }
}

// make array of CGPoints from array of float2
let cgPoints = pts.map(CGPoint.init)
// use that array to create a shape node
let node = SKShapeNode(points: UnsafeMutablePointer(cgPoints), count: cgPoints.count)

当然,这假定您的路径在与场景相同的坐标系中指定。如果不是,你需要进行一些转换。