Как показать GKPath в GameplayKit

есть ли трюк, чтобы показать 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)
    }


}

Я ищу простую функцию, чтобы показать этот путь. Спасибо


person Simone Pistecchia    schedule 07.02.2016    source источник


Ответы (1)


GameplayKit не является графическим фреймворком. Это набор инструментов низкого уровня, который можно использовать с любой графической структурой. В нем нет никаких функций для рисования GKPath, потому что существует как минимум столько же способов интерпретации пути, сколько существует наборов графических инструментов и систем координат для этого.

Поскольку вы работаете со SpriteKit, несложно создать CGPath, используя тот же набор точек, что и GKPath, а затем назначить его SKShapeNode для размещения в вашей сцене.

Вы можете найти пример кода Apple, который делает именно это, в двух крупных демонстрационных проектах: AgentsCatalog и DemoBots.

Вот немного для начала:

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

Это, конечно, предполагает, что ваш путь указан в той же системе координат, что и ваша сцена. Если нет, вам понадобятся некоторые преобразования.

person rickster    schedule 08.02.2016