IOS 粒子系统 (CAEmitterLayer)实例详解
一、系统剖析
在uikit中,粒子系统由两部分组成:
· 一个或多个caemittercells:发射器电池可以看作是单个粒子的原型(例如,一个单一的粉扑在一团烟雾)。当散发出一个粒子,uikit根据这个发射粒子和定义的基础上创建一个随机粒子。此原型包括一些属性来控制粒子的图片,颜色,方向,运动,缩放比例和生命周期。
· 一个或多个caemitterlayers,但通常只有一个:这个发射的层主要控制粒子的形状(例如,一个点,矩形或圆形)和发射的位置(例如,在矩形内,或边缘)。这个层具有全局的乘法器,可以施加到系统内的caemittercells。这些给你一个简单的方法覆盖的所有粒子的变化。比如一个人为的例子将改变x雨来模拟风的速度。
基础是简单的,但这些参数却是相当微妙的。caemitterlayer有超过30种不同的参数进行自定义粒子的行为。下面,我就拼出来的一些特殊问题
二、不可测性
1、是什么让粒子系统成为一个随机的系统?
caemittercell的属性一般有两个参数:一个均值和一个“cone”,比如velocity 和velocityrange。
默认情况下,这个“cone”是0,这就以为着所有粒子将具有相同的速度。通过改变这个“cone”,每个发射粒子会随机被扰动获得一个这个“cone”范围内的值。这点在apple官方文档caemitterlayer documentation: 有讲解:
each layer has its ownrandom number generator state. emitter cell properties that are defined as amean and a range, such as a cell's speed, the value of the properties areuniformly distributed in the interval [m - r/2, m + r/2].
2、发射的方向
caemittercells有一个velocity(速度)的属性,这意味着发送方向上的速度。实际上这个发射的方向是通过emissionlongitude属性定义的。apple这样阐述的:
the emission longitude is theorientation of the emission angle in the xy-plane. it is also often referred toas the azimuth.
三、代码
- (void)viewdidload { [super viewdidload]; caemitterlayer *emitterlayer = [caemitterlayer layer]; emitterlayer.emitterposition = self.view.center; _emitterlayer = emitterlayer; [self.view.layer addsublayer:emitterlayer]; caemittercell *funnyemittercell = [caemittercell emittercell]; funnyemittercell.contents = (id)[uiimage imagenamed:@"funny.jpg"].cgimage; funnyemittercell.birthrate = 10.0; funnyemittercell.velocity = 200.0; funnyemittercell.lifetime = 5.0; funnyemittercell.scale = 0.1; funnyemittercell.name = @"funny"; emitterlayer.emittercells = [nsarray arraywithobject:funnyemittercell]; [self bumpangle]; uilabel *anglelabel = [[uilabel alloc] initwithframe:cgrectmake(20, 20, 100, 30)]; anglelabel.backgroundcolor = [uicolor clearcolor]; [self.view addsubview:anglelabel]; _anglelabel = anglelabel; } - (void) bumpangle { nsnumber *emissionlongitude = [_emitterlayer valueforkeypath:@"emittercells.funny.emissionlongitude"]; nsnumber *nextlongitude = [nsnumber numberwithfloat:[emissionlongitude floatvalue] + 0.02]; [_emitterlayer setvalue:nextlongitude forkeypath:@"emittercells.funny.emissionlongitude"]; _anglelabel.text = [nsstring stringwithformat:@"%.0f degrees", [nextlongitude floatvalue] * 180 / m_pi]; [self performselector:@selector(bumpangle) withobject:nil afterdelay:0.1]; }
代码设置/结构说明:
1、caemittercell
caemittercell *effectcell = [caemittercell emittercell];
effectcell 几个重要属性:
1).birthrate 顾名思义没有这个也就没有effectcell,这个必须要设置,具体含义是每秒某个点产生的effectcell数量
2).lifetime & lifetimerange 表示effectcell的生命周期,既在屏幕上的显示时间要多长。
3).contents 这个和calayer一样,只是用来设置图片
4).name 这个是当effectcell存在caeemitter 的emittercells中用来辨认的。用到setvalue forkeypath比较有用
5).velocity & velocityrange & emissionrange 表示cell向屏幕右边飞行的速度 & 在右边什么范围内飞行& +-角度扩散
6).把cell做成array放进caeemitter.emittercells里去。caeemitter.rendermode有个效果很不错,能变成火的就是kcaemitterlayeradditive
属性:
alpharange: 一个粒子的颜色alpha能改变的范围;
alphaspeed:粒子透明度在生命周期内的改变速度;
birthrate:粒子参数的速度乘数因子;
bluerange:一个粒子的颜色blue 能改变的范围;
bluespeed: 粒子blue在生命周期内的改变速度;
color:粒子的颜色
contents:是个cgimageref的对象,既粒子要展现的图片;
contentsrect:应该画在contents里的子rectangle:
emissionlatitude:发射的z轴方向的角度
emissionlongitude:x-y平面的发射方向
emissionrange;周围发射角度
emittercells:粒子发射的粒子
enabled:粒子是否被渲染
greenrange: 一个粒子的颜色green 能改变的范围;
greenspeed: 粒子green在生命周期内的改变速度;
lifetime:生命周期
lifetimerange:生命周期范围
magnificationfilter:不是很清楚好像增加自己的大小
minificatonfilter:减小自己的大小
minificationfilterbias:减小大小的因子
name:粒子的名字
redrange:一个粒子的颜色red 能改变的范围;
redspeed; 粒子red在生命周期内的改变速度;
scale:缩放比例:
scalerange:缩放比例范围;
scalespeed:缩放比例速度:
spin:子旋转角度
spinrange:子旋转角度范围
style:不是很清楚:
velocity:速度
velocityrange:速度范围
xacceleration:粒子x方向的加速度分量
yacceleration:粒子y方向的加速度分量
zacceleration:粒子z方向的加速度分量
2、caemitterlayer
caemitterlayer提供了一个基于core animation的粒子发射系统,粒子用caemittercell来初始化。粒子画在背景层盒边界上
属性:
birthrate:粒子产生系数,默认1.0;
emittercells: 装着caemittercell对象的数组,被用于把粒子投放到layer上;
emitterdepth:决定粒子形状的深度联系:emittershape
emittermode:发射模式
nsstring * const kcaemitterlayerpoints;
nsstring * const kcaemitterlayeroutline;
nsstring * const kcaemitterlayersurface;
nsstring * const kcaemitterlayervolume;
emitterposition:发射位置
emittershape:发射源的形状:
nsstring * const kcaemitterlayerpoint;
nsstring * const kcaemitterlayerline;
nsstring * const kcaemitterlayerrectangle;
nsstring * const kcaemitterlayercuboid;
nsstring * const kcaemitterlayercircle;
nsstring * const kcaemitterlayersphere;
emittersize:发射源的尺寸大;
emitterzposition:发射源的z坐标位置;
lifetime:粒子生命周期
preservesdepth:不是多很清楚(粒子是平展在层上)
rendermode:渲染模式:
nsstring * const kcaemitterlayerunordered;
nsstring * const kcaemitterlayeroldestfirst;
nsstring * const kcaemitterlayeroldestlast;
nsstring * const kcaemitterlayerbacktofront;
nsstring * const kcaemitterlayeradditive;
scale:粒子的缩放比例:
seed:用于初始化随机数产生的种子
spin:自旋转速度
velocity:粒子速度
以上就是对ios 粒子系统的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!