使用OC和Swift两种语言写一个发射烟花的小项目
OC与Swift两种实现方式基本上区别不大,主要是在一些对象或方法的调用方式不同,附带源码。
OC代码样式:
self.view.backgroundColor = [UIColor blackColor];
//加载颗粒状的火花图片
CAEmitterLayer *emitterLa = [CAEmitterLayer layer];
emitterLa.emitterPosition = CGPointMake(self.view.bounds.size.width/2, self.view.bounds.size.height*(.75));//*(0.75)
emitterLa.renderMode = kCAEmitterLayerAdditive;
//在爆炸前逐渐隐藏发射颗粒
CAEmitterCell *emitterCeRocket = [CAEmitterCell emitterCell];
emitterCeRocket.emissionLongitude = -M_PI/2;
emitterCeRocket.emissionLatitude = 0;
emitterCeRocket.lifetime = 1.6;
emitterCeRocket.birthRate = 1;
emitterCeRocket.velocity = 400;
emitterCeRocket.velocityRange = 100;
emitterCeRocket.yAcceleration = 250;
emitterCeRocket.emissionRange = M_PI/4;
emitterCeRocket.color = CGColorCreateCopy([UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:0.5].CGColor);
emitterCeRocket.redRange = 0.5;
emitterCeRocket.greenRange = 0.5;
emitterCeRocket.blueRange = 0.5;
//设置动画效果的路径名称
[emitterCeRocket setName:@"rocket"];
//添加路径状态
CAEmitterCell *emitterCeFly = [CAEmitterCell emitterCell];
emitterCeFly.contents = (id)[UIImage imageNamed:@"tspark.png"].CGImage;
emitterCeFly.emissionLongitude = (4*M_PI)/2;
emitterCeFly.scale = 0.4;
emitterCeFly.velocity = 100;
emitterCeFly.birthRate = 45;
emitterCeFly.lifetime = 1.5;
emitterCeFly.yAcceleration = 350;
emitterCeFly.emissionRange = M_PI/7;
emitterCeFly.alphaSpeed = -0.7;
emitterCeFly.scaleSpeed = -0.1;
emitterCeFly.scaleRange = 0.1;
emitterCeFly.beginTime = 0.01;
emitterCeFly.duration = 0.7;
//设置爆炸
CAEmitterCell *emitterCeFirework = [CAEmitterCell emitterCell];
emitterCeFirework.contents = (id)[UIImage imageNamed:@"tspark.png"].CGImage;
emitterCeFirework.birthRate = 9999;
emitterCeFirework.scale = 0.6;
emitterCeFirework.velocity = 130;
emitterCeFirework.lifetime = 2;
emitterCeFirework.alphaSpeed = -0.2;
emitterCeFirework.yAcceleration = 80;
emitterCeFirework.beginTime = 1.5;
emitterCeFirework.duration = 0.1;
emitterCeFirework.emissionRange = 2*M_PI;
emitterCeFirework.scaleSpeed = -0.1;
emitterCeFirework.spin = 2;
//设置爆炸动画名称
[emitterCeFirework setName:@"firework"];
//添加重复过程
CAEmitterCell *emitterCePreSpark = [CAEmitterCell emitterCell];
emitterCePreSpark.birthRate = 80;
emitterCePreSpark.velocity = emitterCeFirework.velocity*0.7;
emitterCePreSpark.lifetime = 1.7;
emitterCePreSpark.yAcceleration = emitterCeFirework.yAcceleration*0.85;
emitterCePreSpark.beginTime = emitterCeFirework.beginTime-0.2;
emitterCePreSpark.emissionRange = emitterCeFirework.emissionRange;
emitterCePreSpark.greenSpeed = 100;
emitterCePreSpark.blueSpeed = 100;
emitterCePreSpark.redSpeed = 100;
//设置重复动画名称
[emitterCePreSpark setName:@"preSpark"];
//烟花最后的闪光
CAEmitterCell *emitterCeSparkle = [CAEmitterCell emitterCell];
emitterCeSparkle.contents = (id)[UIImage imageNamed:@"tspark.png"].CGImage;
emitterCeSparkle.lifetime = 0.05;
emitterCeSparkle.yAcceleration = 250;
emitterCeSparkle.beginTime = 0.8;
emitterCeSparkle.scale = 0.4;
emitterCeSparkle.birthRate = 10;
emitterCePreSpark.emitterCells = [NSArray arrayWithObjects:emitterCeSparkle, nil];
emitterCeRocket.emitterCells = [NSArray arrayWithObjects:emitterCeFly,emitterCeFirework,emitterCePreSpark, nil];
emitterLa.emitterCells = [NSArray arrayWithObjects:emitterCeRocket, nil];
[self.view.layer addSublayer:emitterLa];
Swift的代码样式:
self.view.backgroundColor = UIColor.blackColor();
//加载颗粒状的火花图片
let emitterLa = CAEmitterLayer();
emitterLa.emitterPosition = CGPointMake(self.view.bounds.size.width/2, self.view.bounds.size.height*0.75);
emitterLa.renderMode = kCAEmitterLayerAdditive;
//爆炸前逐渐隐藏发射颗粒
let emitterCeRocket = CAEmitterCell();
emitterCeRocket.emissionLongitude = CGFloat(-M_PI_2);
emitterCeRocket.emissionLatitude = 0;
emitterCeRocket.lifetime = 1.6;
emitterCeRocket.birthRate = 1;
emitterCeRocket.velocity = 400;
emitterCeRocket.velocityRange = 100;
emitterCeRocket.yAcceleration = 250;
emitterCeRocket.emissionRange = CGFloat(M_PI/4);
emitterCeRocket.color = CGColorCreateCopy(UIColor(red: 0.5, green:0.5, blue:0.5, alpha:0.5).CGColor);
emitterCeRocket.redRange = 0.5;
emitterCeRocket.greenRange = 0.5;
emitterCeRocket.blueRange = 0.5;
//设置动画效果的路径名称
emitterCeRocket.name = "rocket";
//添加路径状态
let emitterCeFly = CAEmitterCell();
emitterCeFly.contents = UIImage(named: "tspark.png")!.CGImage;
emitterCeFly.emissionLongitude = CGFloat((4*M_PI)/2);
emitterCeFly.scale = 0.4;
emitterCeFly.velocity = 100;
emitterCeFly.birthRate = 45;
emitterCeFly.lifetime = 1.5;
emitterCeFly.yAcceleration = 350;
emitterCeFly.emissionRange = CGFloat(M_PI/7);
emitterCeFly.alphaSpeed = -0.7;
emitterCeFly.scaleSpeed = -0.1;
emitterCeFly.scaleRange = 0.1;
emitterCeFly.beginTime = 0.01;
emitterCeFly.duration = 0.7;
//设置爆炸
let emitterCeFirework = CAEmitterCell();
emitterCeFirework.contents = UIImage(named: "tspark.png")!.CGImage;
emitterCeFirework.birthRate = 9999;
emitterCeFirework.scale = 0.6;
emitterCeFirework.velocity = 130;
emitterCeFirework.lifetime = 2;
emitterCeFirework.alphaSpeed = -0.2;
emitterCeFirework.yAcceleration = 80;
emitterCeFirework.beginTime = 1.5;
emitterCeFirework.duration = 0.1;
emitterCeFirework.emissionRange = CGFloat(2*M_PI);
emitterCeFirework.scaleSpeed = -0.1;
emitterCeFirework.spin = 2;
//设置爆炸动画名称
emitterCeFirework.name = "firework";
//添加重复过程
let emitterCePreSpark = CAEmitterCell();
emitterCePreSpark.birthRate = 80;
emitterCePreSpark.velocity = emitterCeFirework.velocity*0.7;
emitterCePreSpark.lifetime = 1.7;
emitterCePreSpark.yAcceleration = emitterCeFirework.yAcceleration*0.85;
emitterCePreSpark.beginTime = emitterCeFirework.beginTime-0.2;
emitterCePreSpark.emissionRange = emitterCeFirework.emissionRange;
emitterCePreSpark.greenSpeed = 100;
emitterCePreSpark.blueSpeed = 100;
emitterCePreSpark.redSpeed = 100;
//设置重复动画名称
emitterCePreSpark.name = "preSpark";
//烟花最后的闪光
let emitterCeSparkle = CAEmitterCell();
emitterCeSparkle.contents = UIImage(named: "tspark.png")!.CGImage;
emitterCeSparkle.lifetime = 0.05;
emitterCeSparkle.yAcceleration = 250;
emitterCeSparkle.beginTime = 0.8;
emitterCeSparkle.scale = 0.4;
emitterCeSparkle.birthRate = 10;
emitterCePreSpark.emitterCells = NSArray.init(objects:emitterCeSparkle) as? [CAEmitterCell];
emitterCeRocket.emitterCells = NSArray.init(objects:emitterCeFly,emitterCeFirework,emitterCePreSpark) as? [CAEmitterCell];
emitterLa.emitterCells = NSArray.init(objects: emitterCeRocket) as? [CAEmitterCell];
self.view.layer.addSublayer(emitterLa);
源码下载:http://download.csdn.net/detail/hbblzjy/9584992
效果图:
使用OC和Swift两种语言写一个发射烟花的小项目的更多相关文章
- 【Swfit】Swift与OC两种语法写单例的区别
Swift与OC两种语法写单例的区别 例如写一个NetworkTools的单例 (1)OC写单例 + (instancetype)sharedNetworkTools { static id inst ...
- 一个label两种颜色,一个label两种字体
-(void)addLabel{ UILabel *label = [[UILabel alloc]init]; label.backgroundColor = [UIColor grayColor] ...
- 用C语言写一个“事件”的模拟程序
源:用C语言写一个“事件”的模拟程序 Example.c //定义一个函数指针 func int (*func) (void); //调用该函数相当于触发了事件. //该事件触发后,会检查函数指针fu ...
- 用 C# 写一个 Redis 数据同步小工具
用 C# 写一个 Redis 数据同步小工具 Intro 为了实现 redis 的数据迁移而写的一个小工具,将一个实例中的 redis 数据同步到另外一个实例中.(原本打算找一个已有的工具去做,找了一 ...
- 两种语言实现设计模式(C++和Java)(一:工厂模式)
本篇开始记录实现设计模式在工作中的两种常见语言上的实现. 本篇介绍最简单的工厂模式. 工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品:在工厂中加工产品,使用产 ...
- 两种语言实现设计模式(C++和Java)(三:策略模式)
策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异.用策略模式 ...
- JavaScript两种方法来定义一个函数
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 可采用两种方法得到一个EJB对象
(本文是转载其他人的技术文章,觉得说得挺浅显易懂,特借来学习) 在前面学习的例子中,只有一个EJB,但是对于一个真实的项目,EJB的数量可以有很多,而且EJB之间也会互相调用,那么在一个EJB ...
- 网络编程—【自己动手】用C语言写一个基于服务器和客户端(TCP)!
如果想要自己写一个服务器和客户端,我们需要掌握一定的网络编程技术,个人认为,网络编程中最关键的就是这个东西--socket(套接字). socket(套接字):简单来讲,socket就是用于描述IP地 ...
随机推荐
- 关于java的Synchronized,你可能需要知道这些(下)
上一篇文章介绍了synchronized的基本使用方法和实现,在实现部分说明了synchronized的底层实现依赖系统互斥锁mutex,但是这个一个重型锁,竞争导致线程阻塞挂起,后续拿到锁后再恢复线 ...
- Sybase identity 字段
1.identity Oracle, DB2, pgSQL中都有sequence的概念,这个概念比Identity先进很多,在Sybase中没有Sequence对象,与之相对应的是Identity 2 ...
- Linux测量kernel子模块加载时间的方法
1. 在文件kernel/init/main.c里面,在接口do_one_initcall( )中,将initcall_debug设置为true,然后编译boot.img 2. 使用adb shell ...
- 干货!Android Studio快捷键VS Eclipse快捷键~亲测!
eclipse as 英文描述 中文描述 ctrl+shift+r ctrl+shift+r Navigate->File 找工作空间的文件 ctrl+shift+t ctrl+shift+t ...
- java实例化对象
摘要:分享牛,分享牛分享,java类加载机制,java实例化对象,java实例化对象机制,java基础. java是如何实例化对象的呢?以及实例化对象的先后顺序是什么?下面我们以测试的方式说明. 1. ...
- MT8127:如何让system分区可读写(MTK安卓6.0)
Android 系统默认情况下,system 分区是只读 mount 的,因为无法进行往里写数据的,可 以用 adb 命令 adb remount 重新 mount 一下. 也可以通过在板子上,输入以 ...
- 在8X8的棋盘上分布着n个骑士,他们想约在某一个格中聚会。骑士每天可以像国际象棋中的马那样移动一次,可以从中间像8个方向移动(当然不能走出棋盘),请计算n个骑士的最早聚会地点和要走多少天。要求尽早聚会
在8X8的棋盘上分布着n个骑士,他们想约在某一个格中聚会.骑士每天可以像国际象棋中的马那样移动一次,可以从中间像8个方向移动(当然不能走出棋盘),请计算n个骑士的最早聚会地点和要走多少天.要求尽早聚会 ...
- 【安卓开发】Layout Inflation不能这么用
Layout inflation在Android上下文环境下转换XML文件成View结构对象的时候需要用到. LayoutInflater这个对象在Android的SDK中很常见,但是你绝对没想到竟然 ...
- Android 5.0新控件——TextInputLayout
Android 5.0(M)新控件--TextInputLayout 介绍之前,先直观的看一下效果 TextInputLayout其实是一个容器,他继承自LinearLayout,该容器是作用于Tex ...
- activiti节点跳转
分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519) activiti使用的时候,通常需要跟业务紧密的结合在一起,有些业 ...