彗星:Swift中的动画粒子

CAEmitterLayer仅指定粒子的起点。 要更改粒子的外观,我们必须看一下CAEmitterCell。

CAEmitterCell

CAEmitterCell是CAEmitterLayer发射的粒子的模板,并确定其外观和移动方式。 CAEmitterLayer具有一个或多个CAEmitterCells数组,每个可能具有不同的配置和样式。 要更改粒子的外观,可以使用CAEmitterCell的以下属性:

  • 内容
    单元格的内容需要PNG图像文件作为粒子的基础。 该图像将用于确定粒子的形状。 最好使用白色图像,因为视觉属性会为其着色。
  • 视觉属性
    设置内容后,视觉属性可以更改粒子的颜色和比例。 也可以设置颜色的RGBa值的速度和范围。 色速定义了颜色在单元生命周期中的变化方式,范围指定了每个新生成的粒子之间颜色成分可以变化的量。
  • 运动属性
    运动属性可以使细胞旋转,并确定粒子发射角的方向。 就像颜色范围一样,发射范围可以改变每个新生成的粒子之间的发射角度(以弧度为单位)。 例如:上面显示CAEmitterLayer形状的GIF显示出2π的发射范围这使得粒子可以在任何方向上生成。
  • 时间属性
    这些属性涉及与时间相关的任何事物,包括寿命,出生率(每秒粒子数),粒子的速度和加速度。

让我展示一个示例,说明四个不同的单元格可能是什么样的:

太酷了吧?

创建线条和彗星

现在,我们对粒子在iOS中的工作方式有了基本的了解,让我们看看Voicy中的线条和彗星。

画一条线

画一条线很简单。 您只需要两个坐标,一个颜色和一个宽度。 和繁荣! 就这样,你有一条线。
我创建了一个LineModel结构,该结构具有坐标和线条颜色的属性。 一个简单的drawLine()函数返回一个CAShapeLayer,可以将其添加到UIView来绘制两个坐标之间的线:

  struct LineModel { 
var startPoint:CGPoint
var endPoint:CGPoint
var lineColor:UIColor
  func drawLine()-> CAShapeLayer { 
//创建路径
让linePath = UIBezierPath()
linePath.moveToPoint(startPoint)
linePath.addLineToPoint(endPoint)
  //将行创建为CAShapeLayer 
让lineLayer = CAShapeLayer()
lineLayer.path = linePath.CGPath
lineLayer.lineWidth = 3
lineLayer.strokeColor = lineColor.CGColor
 返回lineLayer 
}
}

动画彗星

对于彗星动画,我向LineModel添加了另一个函数,该函数返回CAEmitterLayer:

  func animateComet()-> CAEmitterLayer { 
//创建发射器
让发射器= CAEmitterLayer()
generator.emitterShape = kCAEmitterLayerPoint
generator.emitterPosition =起点

//创建彗星单元
let cell = CAEmitterCell()
cell.contents = UIImage(named:“ comet”)!. CGImage
cell.birthRate = 0.2 * Float(Int.random(500 ... 2000))/ 1000
cell.lifetime = 10.0
cell.velocity = 800
cell.velocityRange = 700
  //将单元格添加到发射器 
generator.emitterCells = [cell]
返回发射器
}

那么这里到底发生了什么? 好吧,首先,我创建一个点形CAEmitterLayer,并将其位置设置为LineModel的起点。 然后,我创建一个CAEmitterCell,它将成为彗星。

  • 单元格的内容是白色png图像(称为“彗星”),其彗星形状带有逐渐消失的“尾巴”,如下所示:
  • 该图像已经完全符合我们希望彗星的外观,因此无需添加任何视觉属性。
  • 我们不希望每一行都同时生成一个彗星,因此为birthRate属性随机生成的值将使生成率在0.1到0.4之间变化。 这意味着彗星将每2.5到10秒产生一次。
  • 彗星将走出屏幕,因此它需要足够长的lifeTime值(以秒为单位),因此它不会在动画中间消失。
  • 每个产卵彗星的速度在100到1500之间变化,以使彗星的外观和感觉更加动态。

屏幕上有一颗彗星飞过! 真好! 唯一的问题是,它还不完全符合要求……

角度计算

默认情况下,从点状发射器发射的像元将沿水平方向从左向右传播,如上面的GIF所示。 幸运的是,CAEmitterCell具有更改发射角度(以弧度为单位)的属性。 现在我们需要计算确切的角度,以便彗星跟随这条线。

现在该清理我的几何数学并开始计算角度了。 要计算角度,我们需要知道直角三角形的至少两个边: