iOS使用CAEmitterLayer创建落叶动画

时间:2017-01-25 13:28:44

标签: ios swift animation particles caemitterlayer

我想创建一个落叶动画,这是我的代码:

 private func setupEmitter() {


    let size = self.bounds.size

    let emitter             = CAEmitterLayer()
    emitter.emitterSize     = CGSize(width: size.width, height: 1)
    emitter.emitterPosition = CGPoint(x: size.width / 2, y: -100)
    emitter.emitterShape    = kCAEmitterLayerLine
    self.layer.addSublayer(emitter)

    //SHAPE 1
    let shape1 = CAEmitterCell()
    shape1.birthRate = 10
    shape1.lifetime = 7
    shape1.lifetimeRange = 2
    shape1.velocity = 110
    shape1.velocityRange = 10
    shape1.emissionLongitude = CGFloat(M_PI)
    shape1.emissionRange = CGFloat(M_PI_4)
    shape1.spin = 0.2
    shape1.spinRange = 0
    shape1.scaleSpeed = -0.05
    shape1.scale  = -0.3
    shape1.scaleRange = -0.1
    shape1.contents = UIImage(named: "shape1")?.cgImage


    //SHAPE 2
    let shape2 = CAEmitterCell()
    shape2.birthRate = 10
    shape2.lifetime = 7
    shape2.lifetimeRange = 2
    shape2.velocity = 110
    shape2.velocityRange = 90
    shape2.emissionLongitude = CGFloat(M_PI)
    shape2.emissionRange = CGFloat(M_PI_4)
    shape2.spin = 0.2
    shape2.spinRange = 0.5
    shape2.scaleSpeed = -0.05
    shape2.scale  = -0.35
    shape2.scaleRange = 0
    shape2.contents = UIImage(named: "shape2")?.cgImage

    emitter.emitterCells = [shape1, shape2]


}

我从上面的代码中得到了什么:

绘制我想要实现的目标:

那么我怎么能更新我的代码来实现我想要的东西(Objective-C代码被接受)?

1 个答案:

答案 0 :(得分:2)

不幸的是,这并不容易,也不简单,我也不能简单地说"这是执行此操作的代码!"

实现目标的方法有多种,其中没有一种是理想的,所有这些方法都以不同的方式变得棘手。

当它们向下漂浮时,叶子的这些运动是它们达到空气动力学效率,停滞然后再次下降的速度......它是你需要的物理系统,或者是作为响应编码的行为下降率。

物理:

核心动画粒子没有足够的物理响应能力来做到这一点,所以你需要使用受力和场的组合影响的SKSpriteNodes,或CALayers受到影响UIKit Dynamics力量和领域的变化。

这两件事几乎相同:CALayersSKSpriteNodes更强大,更有趣的变体,而UIKit DynamicsSKPhysics非常相似。

然而......如果你想走这条路,建立自己的粒子'响应力和场的系统,我强烈建议使用SceneKit的粒子,因为它们具有内置的粒子的旋转(3D)能力,并且它在处理时非常有效。许多不同的粒子发射器,每个粒子发射器都有自己的字段,它们会响应。

从算法:

这涉及到将弧线随机化到失速,然后加速到另一个弧向下,空气动力学影响,以及随后的失速,一遍又一遍。

这也需要是自定义粒子,因为我认为没有一种方法可以充分直接影响CAEmitter粒子,也不会影响SpriteKit或SceneKit。

这意味着您必须在OpenGL中创建四边形,CALayers是叶子的简单图像,SKSpriteNodes是叶子,或者是SceneKit中具有叶子纹理的四边形。

在每种情况下,您需要尽可能多的图层或对象。

CALayers的优势在于它们内置了3D旋转功能,您似乎已经掌握了Core Animation。