Разметка узлов вдоль UIBezierPath в спрайтеките - PullRequest
2 голосов
/ 03 октября 2019

Я сейчас разрабатываю игру в спрайтеките, в которой есть карта уровня игры. Я использую UIBezierPath для пути, я хочу, чтобы узлы уровня следовали, единственная проблема, с которой я столкнулся - это попытка нанести их вдоль пути, и мне было интересно, как мне добавить их в сцену, чтобы они были добавлены в путь путии каждый из них индивидуально разнесен на 50 от последнего, который был нанесен перед ним. В настоящее время у меня есть это:

enter image description here

Мой код

let path = UIBezierPath()
path.move(to: CGPoint(x: -200, y: 0))
path.addCurve(to: CGPoint(x: 0, y: 0), controlPoint1: CGPoint(x: 0, y: 0), controlPoint2: CGPoint(x: -200, y: 0))
path.addCurve(to: CGPoint(x: 140, y: 0), controlPoint1: CGPoint(x: 60, y: 180), controlPoint2: CGPoint(x: 140, y: 10))
path.addCurve(to: CGPoint(x: 280, y: 0), controlPoint1: CGPoint(x: 220, y: -180), controlPoint2: CGPoint(x: 280, y: 0))
path.addCurve(to: CGPoint(x: 440, y: 0), controlPoint1: CGPoint(x: 400, y: -300), controlPoint2: CGPoint(x: 440, y: 0))

let shapeNode = SKShapeNode(path: path.cgPath)
    shapeNode.strokeColor = UIColor.white
    addChild(shapeNode)


for i in 1...5 {

   let level1 = mapLevelTiles()
   level1.createAndDisplay(Data: lev3)
   level1.position = CGPoint(x: 0 + level1.levelImageNode.size.width * 1.5 * CGFloat(i), y: path.cgPath.currentPoint) //path.cgPath.currentPoint
   level1.zPosition = 10
   addChild(level1)

}

Код вышене достичь того, чего я хочу, потому что это позволяет мне получить конечную точку последней линии на пути. Как я могу построить узлы вдоль пути, который я нарисовал?

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Вы можете использовать timingFunction метод SKAction.follow(path:), чтобы установить интервал между вашими спрайтами вдоль пути Безье. Как правило, вы используете метод timingFunction для настройки времени действия, например, для упрощения или замедления. В этом случае вы можете использовать его для установки начальной точки спрайта вдоль пути.

Например, если вы хотите запустить спрайт в средней точке вашего пути Безье, вы можете сместить time параметр timingFunction на 0,5, где time начинается с 0 и заканчивается на 1.

let move = SKAction.follow(path.cgPath, speed: 100)

move.timingFunction = {
    time in
    return min(time + 0.5, 1)
}

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

Вот пример, чтобы установить интервал для набора спрайтов по пути Безье

// Show the path
let shapeNode = SKShapeNode(path: path.cgPath)
shapeNode.strokeColor = UIColor.white
addChild(shapeNode)

// Add 5 sprites to the scene at various points along the path
for i in 1...5 {            
    let move = SKAction.follow(path.cgPath, speed: 100)

    move.timingFunction = {
        time in
        return min(time + 0.1 * Float(i), 1)
    }

    let sprite = SKSpriteNode(color: .blue, size: CGSize(width: 20, height: 20))
    addChild(sprite)
    sprite.run(move)
} 
0 голосов
/ 09 октября 2019

Вы можете перемещать свои спрайты один за другим, используя следующий код.

 let path = UIBezierPath()
            path.move(to: CGPoint(x: -200, y: 0))
            path.addCurve(to: CGPoint(x: 0, y: 0), controlPoint1: CGPoint(x: 0, y: 0), controlPoint2: CGPoint(x: -200, y: 0))
            path.addCurve(to: CGPoint(x: 140, y: 0), controlPoint1: CGPoint(x: 60, y: 180), controlPoint2: CGPoint(x: 140, y: 10))
            path.addCurve(to: CGPoint(x: 280, y: 0), controlPoint1: CGPoint(x: 220, y: -180), controlPoint2: CGPoint(x: 280, y: 0))
            path.addCurve(to: CGPoint(x: 440, y: 0), controlPoint1: CGPoint(x: 400, y: -300), controlPoint2: CGPoint(x: 440, y: 0))

 let shapeNode = SKShapeNode(path: path.cgPath)
                shapeNode.strokeColor = UIColor.white
                addChild(shapeNode)


 for i in 1...5 {

     let level1 = SKShapeNode(circleOfRadius: 30.0)
     level1.zPosition = 10
     addChild(level1)

     let followPath = SKAction.follow(path.cgPath, asOffset: true, orientToPath: true, duration: 5.0)
     level1.run(SKAction.sequence([SKAction.hide(),
           SKAction.wait(forDuration: 2.0 * Double(i)),
           SKAction.unhide(),
           followPath,
           SKAction.removeFromParent()]))

 }
...