SpriteKit-动画化SKShapeNode形状路径

时间:2018-12-21 17:54:19

标签: ios swift xcode sprite-kit skshapenode

当前,我正在使用Core Graphics来处理形状,并使用CAShapeLayerCABasicAnimation路径动画将形状转换为其他形状。

但是,由于游戏的复杂性,如果使用SKShapeNode(丢弃CAShapeLayer并使用SKShapeNode进入SpritKit,我可以使它平滑地动画变成不同的形状?

我没有看到可以让您更改SKAction的路径的SKShapeNode方法。

谢谢。

1 个答案:

答案 0 :(得分:4)

好吧。节日快乐。

最简单的方法是使用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方法。

通过上述过程,您可以在设计时提取一对(时间,presentation_Path)。然后在运行时在SKCustomAction中分配回来。请参考SKKeyframeSequence来获得想法(不是完全相同,而是相似的动画)。