IOS粒子系统的实现
来源:互联网 发布:淘宝店名能改吗 编辑:程序博客网 时间:2024/04/30 03:37
IOS粒子系统的实现
IOS的CoreGraphic可以实现简单的粒子系统的效果
我们来简单介绍一下,实现粒子系统其实非常简单,比较复杂的是其参数的设置
实现粒子系统主要用到两个类
CAEmitterLayer和CAEmitterCell
先介绍一下CAEmitterLayer(发射层)
其主要的属性有
ViewController
我们来简单介绍一下,实现粒子系统其实非常简单,比较复杂的是其参数的设置
实现粒子系统主要用到两个类
CAEmitterLayer和CAEmitterCell
先介绍一下CAEmitterLayer(发射层)
其主要的属性有
@property(copy) NSArray *emitterCells; //粒子单元数组,有多少个粒子单元@property float birthRate; 出生率因子,每秒产生的粒子数量,默认是1@property float lifetime; 生命周期,单位是秒,默认是1@property CGPoint emitterPosition; 粒子位置默认是CGPointZero@property CGFloat emitterZPosition; Z轴位置默认是0@property CGSize emitterSize; 发射尺寸@property CGFloat emitterDepth; 发射深度依赖属性emitterShape,可以被忽略 @property(copy) NSString *emitterShape;发射形状kCAEmitterLayerPoint 点 默认值kCAEmitterLayerLine 线kCAEmitterLayerRectangle 三角kCAEmitterLayerCuboid 立方kCAEmitterLayerCircle 圆kCAEmitterLayerSphere 球@property(copy) NSString *emitterMode; 发射模式kCAEmitterLayerPoints 点群kCAEmitterLayerOutline 轮廓kCAEmitterLayerSurface 地面kCAEmitterLayerVolume 团 默认值@property(copy) NSString *renderMode;//渲染模式kCAEmitterLayerUnordered 无序的 默认值kCAEmitterLayerOldestFirst 从头开始kCAEmitterLayerOldestLast 从后面开始kCAEmitterLayerBackToFront 按照z轴kCAEmitterLayerAdditive 加法的@property BOOL preservesDepth; 保留深度,默认为No,如果为true会导致某些属性不确定 @property float velocity; 速度 默认为1@property float scale; 比例,默认为1 @property float spin; 旋转角度@property unsigned int seed; 粒子数量 默认是0CAEmitterCell的 的类的主要属性有 + (id)emitterCell; 构造方法+ (id)defaultValueForKey:(NSString *)key;根据keyPath读取效果- (BOOL)shouldArchiveValueForKey:(NSString *)key; 保存效果@property(copy) NSString *name; 根据keyPath构造@property(getter=isEnabled) BOOL enabled; 能否被渲染@property float birthRate;@property float lifetime, lifetimeRange; lifetimeRange生命周期范围,默认是0@property CGFloat emissionLatitude, emissionLongitude; 粒子经纬度 默认是0 z轴和x轴的位置@property CGFloat emissionRange; 发射角度,默认是0@property CGFloat velocity, velocityRange; 速度,速度范围@property CGFloat xAcceleration, yAcceleration, zAcceleration; 三方向加速度@property CGFloat scale, scaleRange, scaleSpeed; 缩放,缩放范围,缩放速度@property CGFloat spin, spinRange; 旋转角度 旋转范围@property CGColorRef color; 粒子颜色@property float redRange, greenRange, blueRange, alphaRange; 颜色范围和透明度范围@property float redSpeed, greenSpeed, blueSpeed, alphaSpeed; 速度@property(retain) id contents; 内容 类型是CGImageRef 默认是nil@property CGRect contentsRect; 内容范围 默认是[0,0,1,1]@property(copy) NSString *minificationFilter, *magnificationFilter; 过滤@property float minificationFilterBias;@property(copy) NSArray *emitterCells; 发射的子粒子@property(copy) NSDictionary *style; 继承layer的属性
本人写的Demo
粒子层类
#ifndef IPhone5
#define IPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)
#endif
#import <QuartzCore/QuartzCore.h>
typedef enum{ PaticleFromePositionModeNone, PaticleFromePositionModeTop, PaticleFromePositionModeCenter, PaticleFromePositionModeBottom}PaticleFromePositionMode;
@interface PaticleLayer : CAEmitterLayer//发射类型@property(nonatomic,assign) PaticleFromePositionMode fromPositonMode;#pragma 初始化//通过粒子图片名字/数组初始化-(id)initWithImageName:(NSString *)imageName;-(id)initWithImageNameArray:(NSArray*)imageArray;-(id)init;#pragma 粒子图片//发射时间-(void)setEmitterTime:(CGFloat)time;//开始倒计时-(void)begin;@end
#import "PaticleLayer.h"//粒子系统s@interface PaticleLayer(){ //图片数组 __strong NSArray* _imageNameArray; //发射位置模式 PaticleFromePositionMode _fromPositonMode; //发射时间 CGFloat _emitterTime;}@end
@implementation PaticleLayer@dynamic fromPositonMode;-(id)init{ self = [super init]; if (self) { _imageNameArray = [NSMutableArray array]; [self DefaultSetting]; } return self;}-(id)initWithImageName:(NSString *)imageName{ self = [super init]; if (self) { _imageNameArray = @[imageName]; [self DefaultSetting]; } return self;}-(id)initWithImageNameArray:(NSArray *)imageArray{ self = [super init]; if (self) { _imageNameArray = imageArray; [self DefaultSetting]; } return self;}-(void)setFromPositonMode:(PaticleFromePositionMode)fromPositonMode{ switch (fromPositonMode) { case PaticleFromePositionModeNone: break; case PaticleFromePositionModeCenter: [self setEmitterPosition:CGPointMake(320/2.0f,(480+(IPhone5?88:0))/2)]; break; case PaticleFromePositionModeTop: [self setEmitterPosition:CGPointMake(320/2.0f,30)]; break; case PaticleFromePositionModeBottom: [self setEmitterPosition:CGPointMake(320/2.0f,(480+(IPhone5?88:0))-30)]; break; default: break; } _fromPositonMode = fromPositonMode;}-(PaticleFromePositionMode)fromPositonMode{ return _fromPositonMode;}-(void)setEmitterTime:(CGFloat)time{ _emitterTime = time;}//渐渐消失-(void)fade{ CABasicAnimation* fade = [CABasicAnimation animationWithKeyPath:@"opacity"]; fade.duration = 1.0; fade.fromValue = @1.0; fade.toValue = @0.0; [self addAnimation:fade forKey:@"fade"]; [NSTimer scheduledTimerWithTimeInterval:0.9 target:self selector:@selector(removeFromSuperlayer) userInfo:nil repeats:NO];}//默认设置-(void)DefaultSetting{ //设置出现时间为永远 [self setEmitterTime:-1.0f]; //设置在中间发射 [self setFromPositonMode:PaticleFromePositionModeCenter]; //设置发射尺寸为全屏幕 [self setEmitterSize:CGSizeMake(320*2.0, 0)]; //设置发射模式 [self setEmitterMode:kCAEmitterLayerOutline]; //设置发射形状,默认圆形 [self setEmitterShape:kCAEmitterLayerLine]; //设置阴影透明度 [self setShadowOpacity:1.0]; //设置半径 [self setShadowRadius:0.0]; // [self setShadowOffset:CGSizeMake(0.0, 1.0)]; // [self setShadowColor:[[UIColor whiteColor]CGColor]]; // [self setSeed:arc4random()%30+1]; //跟粒子 CAEmitterCell* rootCell = [CAEmitterCell emitterCell]; [rootCell setBirthRate:5.0]; [rootCell setVelocity:0]; [rootCell setLifetime:0.35]; //Cells NSArray* children = [self getImageArray]; if (rootCell) { [rootCell setEmitterCells:children]; [self setEmitterCells:@[rootCell]]; } else { [self setEmitterCells:children]; }}-(CAEmitterCell *)createCellWithImage:(UIImage *)image{ CAEmitterCell *cellLayer = [CAEmitterCell emitterCell]; cellLayer.birthRate= 5.0; cellLayer.lifetime= 5.0;cellLayer.velocity= -100;// falling down slowlycellLayer.velocityRange = 0;cellLayer.yAcceleration = 2; cellLayer.emissionRange = 0.5 * M_PI;// some variation in angle cellLayer.spinRange= 0.25 * M_PI;// slow spin cellLayer.contents= (id)[image CGImage]; cellLayer.color= [[UIColor colorWithRed:0.600 green:0.658 blue:0.743 alpha:1.000] CGColor]; return cellLayer;}-(NSArray*)getImageArray{ NSMutableArray* array = [NSMutableArray array]; for (NSString* imageName in _imageNameArray) { UIImage* image = [UIImage imageNamed:imageName]; if (image) { CAEmitterCell* cell = [self createCellWithImage:image]; [array addObject:cell]; } } return array;}-(void)begin{ if (_emitterTime > 0) { [NSTimer scheduledTimerWithTimeInterval:_emitterTime target:self selector:@selector(fade) userInfo:nil repeats:NO]; }}
ViewController
-(IBAction)Render:(id)sender{ PaticleLayer* layer = [[PaticleLayer alloc]initWithImageName:@"birthday.png"]; [layer setEmitterShape:kCAEmitterLayerLine]; [layer setEmitterTime:10.0]; [self.view.layer addSublayer:layer]; [layer begin];}
0 0
- IOS粒子系统的实现
- iOS的粒子系统
- 粒子系统的实现
- 粒子系统的简单实现
- iOS 粒子系统
- 一个简单的粒子系统的实现
- 基于Direct3D实现简单的粒子系统
- 基于GPU的粒子系统实现概要
- 基于Direct3D实现简单的粒子系统
- OpenGL实现的烟花粒子系统
- Cocos2d-x—粒子系统的实现
- unity总结--粒子系统的实现
- opengles实现简单的粒子系统
- 移动平台粒子系统的实现原理
- 粒子系统-烟花效果的实现
- Three.js实现的粒子系统
- 粒子系统实现
- iOS粒子系统,简单了解
- struct 字节对齐详解
- IOS开发指南读书笔记12(IOS数据持久层的建立4)
- java二进制反序列化与序列化
- 澳门仍不景气,但是降速趋缓
- Java svn提交报错"out of date"
- IOS粒子系统的实现
- Centos7 开放端口
- sun.net.www.protocol.http.HttpURLConnection cannot be cast to javax.net.ssl.HttpsURLConnection
- php ord() 函数
- 如何写程序(1)
- 怎么计算apk的启动时间?
- c++ java
- 深入Java系列——面向对象之(一)——抽象
- SQL 日期类型的处理转换