[Perk]如何实现粒子效果
2016-08-29 19:40
267 查看
我们先来看一个简单的下雪的粒子效果:
iOS在5.0之后,在
你所看到的每个雪花都是一个
正因为如此,所以粒子效果实现起来也比较简单,你只需要创建容器,建立一个标准的粒子模型,然后设置一些属性,完了再把这些粒子放在数组当中,放入容器就OK了,我们来看看这个下雪效果的代码:
这便是一个下雪天气的粒子效果,其实很简单,我们所要做的无非就是不断测试和调整这些属性的值来达到满意的效果,其他比如爆炸、下雨之类的就是换换粒子图片再调整属性,那么便OK了!
iOS在5.0之后,在
QuartzCore中引入了一个
CAEmitterLayer类,它是
CALayer的子类,你猜的没错,该类便是实现雨雪、爆炸、烟雾等粒子效果的高性能粒子引擎。
你所看到的每个雪花都是一个
CAEmitterCell对象,这些对象都被放在
CAEmitterLayer这个容器当中,给这个容器和这些对象设置一些属性,那么内部便自动帮我们实现粒子效果。
正因为如此,所以粒子效果实现起来也比较简单,你只需要创建容器,建立一个标准的粒子模型,然后设置一些属性,完了再把这些粒子放在数组当中,放入容器就OK了,我们来看看这个下雪效果的代码:
import UIKit // 导入与否都行,你只需知道是该框架里面的API就行了 import QuartzCore //自定义一个SnowView来封装粒子效果 class SnowView: UIView { required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) creatSnow() } override init(frame: CGRect) { super.init(frame: frame) //核心方法 creatSnow() } func creatSnow() { // 我们先来创建容器 let emitter = layer as! CAEmitterLayer // 粒子发射源 emitter.emitterPosition = CGPoint(x: bounds.size.width / 2, y: 0) // 粒子发射源的范围,设置为CGSize.zero你便能理解该属性 emitter.emitterSize = bounds.size // 粒子发射源的形状 // kCAEmitterLayerLine: 一条线 // kCAEmitterLayerRectangle: 矩形 // kCAEmitterLayerCircle: 圆 // kCAEmitterLayerCuboid: 立方体(三维) // kCAEmitterLayerSphere: 球体(三维) emitter.emitterShape = kCAEmitterLayerRectangle // 再来创建粒子对象 let emitterCell = CAEmitterCell() // 粒子对象 // 粒子内容 emitterCell.contents = UIImage(named: "flake.png")!.CGImage // 每秒生成粒子的个数 emitterCell.birthRate = 200 // 粒子存活平均时间 emitterCell.lifetime = 3.5 // 粒子混合颜色 emitterCell.color = UIColor.whiteColor().CGColor // 粒子颜色变化范围 emitterCell.redRange = 0.0 emitterCell.blueRange = 0.1 emitterCell.greenRange = 0.0 // 粒子运动的速度均值 emitterCell.velocity = 10 // 粒子运动速度变化范围 emitterCell.velocityRange = 350 // 粒子喷射角度 emitterCell.emissionRange = CGFloat(M_PI_2) emitterCell.emissionLongitude = CGFloat(-M_PI) // 粒子的初始加速度(右和下为正,左和上为负) emitterCell.yAcceleration = 70 emitterCell.xAcceleration = 0 // 粒子的分辨率清晰度,越大越虚化,具体效果自己设置来看就理解了 emitterCell.scale = 0.33 // 粒子缩放变化范围 emitterCell.scaleRange = 1.25 // 粒子缩放速度? emitterCell.scaleSpeed = -0.25 // 粒子透明度变化范围 emitterCell.alphaRange = 0.5 // 粒子消逝速度(透明度缩减速度) emitterCell.alphaSpeed = -0.15 // 将粒子对象组成的数组放入CZEmitterLayer容器 emitter.emitterCells = [emitterCell] } // 这里因为是将UIView的layer强转为CAEmitterLayer,所以这里必须要告诉系统该类的layer是CAEmitterLayer override class func layerClass() -> AnyClass { return CAEmitterLayer.self } }
这便是一个下雪天气的粒子效果,其实很简单,我们所要做的无非就是不断测试和调整这些属性的值来达到满意的效果,其他比如爆炸、下雨之类的就是换换粒子图片再调整属性,那么便OK了!
相关文章推荐
- 如何实现立体的DataGrid和具有Windows效果的图片按钮
- 如何实现无刷新的DropdownList联动效果
- asp如何实现图片的动态翻动的效果
- 用DIV+CSS如何实现这种表格效果
- 用DIV+CSS如何实现这种表格效果
- 如何在BCB中正确链接WinAPI函数AlphaBlend()实现半透明效果
- 如何实现无刷新的DropdownList联动效果
- 如何实现表格中行点击时的渐扩效果!
- 如何实现无刷新的DropdownList联动效果
- 如何用DataGrid实现类似DataList多列的效果
- 在循环体中如何实现叠放效果
- 如何实现无刷新的DropdownList联动效果‖ASP.NET技巧
- 如何实现无刷新的DropdownList联动效果 (转贴)
- msdn2的页面跳转效果如何实现的?
- 如何在CSS中实现图片交替效果
- [导入]如何实现立体的DataGrid和具有Windows效果的图片按钮
- 如何实现立体的DataGrid和具有Windows效果的图片按钮
- 如何实现无刷新的DropdownList联动效果
- 如何在FLASH中实现加入收藏夹的效果
- 如何实现表格中行点击时的渐扩效果!