SpriteKit - Animate SKShapeNode Shape Path - PullRequest
       83

SpriteKit - Animate SKShapeNode Shape Path

0 голосов
/ 21 декабря 2018

В настоящее время я использую Core Graphics для фигуры и для преобразования фигуры в другую с анимацией пути CAShapeLayer и CABasicAnimation.

Однако из-за сложности игры, если бычтобы перейти к SpritKit, используя SKShapeNode, (отбрасывая CAShapeLayer и используя SKShapeNode), смогу ли я плавно анимировать его в другую форму?

Я не видел SKAction метода, который позволил бы вам изменить путь SKShapeNode.

Заранее спасибо.

1 Ответ

0 голосов
/ 24 декабря 2018

Хорошо.Счастливых праздников.

Самый простой способ - использовать CALayerAnimation, чтобы научить SKNode, как действовать следующим образом:

class ViewController: UIViewController {


@IBOutlet weak var skview: SKView!
var  path1: CGPath!
var  path2: CGPath!

override func viewDidLoad() {
    super.viewDidLoad()

  path1  = CGPath.init(rect: CGRect.init(x: 0, y: 0, width: 100, height: 100), transform: nil)

    path2 = CGPath.init(rect: CGRect.init(x: 0, y: 0, width: 250, height: 400), transform: nil)

}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    let shapeLayer = CAShapeLayer()
    self.view.layer.addSublayer(shapeLayer)
    shapeLayer.fillColor = UIColor.clear.cgColor
    shapeLayer.path = path1

    let anim = CABasicAnimation.init(keyPath: "path")
    anim.duration = 1.0
    anim.fromValue  = path1
    anim.toValue = path2
    anim.isRemovedOnCompletion  = false


    let shapeNode = SKShapeNode.init(path: path1)
    shapeNode.fillColor = UIColor.green

    skview.scene?.addChild(shapeNode)


    shapeLayer.add(anim, forKey:
    "prepanimation")
    shapeNode.run(SKAction.customAction(withDuration: anim.duration, actionBlock: { (node, timeDuration) in
        (node as! SKShapeNode).path =
        shapeLayer.presentation()?.path
    }))

}
}

Если ваш путь слишком велик и оптимальный способ - рассмотреть возможность преобразованияCABasicAnimation для CAKeyFrameAnimation подход.

Из описанного выше процесса вы можете извлечь пару (time, presentation_Path) во время разработки.Затем назначьте обратно во время выполнения в SKCustomAction.Пожалуйста, обратитесь к SKKeyframeSequence, чтобы получить идею (не совсем, но похожую анимацию).

...