彗星: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具有更改发射角度(以弧度为单位)的属性。 现在我们需要计算确切的角度,以便彗星跟随这条线。
现在该清理我的几何数学并开始计算角度了。 要计算角度,我们需要知道直角三角形的至少两个边: