4

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

 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 代码被接受)?

4

1 回答 1

2

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

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

树叶的这些运动,当它们飘下来时,它们是否达到了它们在空气动力学上变得有效的速度,失速然后再次下降......它要么是你需要的物理系统,要么是编码为对下降速率的响应的行为。

物理:

核心动画粒子没有足够的物理响应来执行此操作,因此您需要使用SKSpriteNodes受力和场组合的影响,或CALayersUIKit Dynamics力和场变化的影响。

这两件事几乎相同:CALayers是 的更强大和有趣的变体SKSpriteNodes,并且UIKit DynamicsSKPhysics.

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

算法:

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

这也需要自定义粒子,因为我认为没有办法直接影响 CAEmitter 粒子,也没有 SpriteKit 或 SceneKit 的粒子。

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

在每种情况下,您都需要与叶子一样多的图层或对象。

CALayers 的优势在于它们内置了 3D 旋转,而且您似乎已经对 Core Animation 有所了解。

于 2017-01-30T15:54:07.170 回答