[置顶] 使用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);

效果图:

                 

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
前言 相信很多朋友在开发中都会遇到图片上传的情况,尤其是多图上传,最 经典的莫过于微信的图片选择了。所有很多情况下会使用到多图选择。 所以就有了这篇文章,今天抽点时间写了个控件。 支持自定义选择图片的样式 支持设置图片选择数量 支持图片预览,删除 支持图片拍照 先来看看效果 实现分析 假如不定义控件,我们要实现这样一个功能,无非是写个GridView在item点击的时候去显示图片进行选择,在返回界面的时候进行GridView的数据刷新。我们把这些逻辑写在我们自定义的GridView中,就成了一个新的控件。
在360对DroidPlugin的特点介绍中有云: 插件的四大组件完全不需要在Host程序中注册,支持Service、Activity、BroadcastReceiver、ContentProvider四大组件。 实现了进程管理,插件的空进程会被及时回收,占用内存低。 之所以支持Service,Activity,ContentProvider三大组件,是因为DroidPlugin在AndroidManifest文件中预先注册了8个运行插件的进程,每个进程预注册Service一个, ContentProvi
本篇介绍ListView控件,这是Android中比较重要也比较复杂的控件,这里只谈到使用ViewHolder机制优化即可。 一、ListView简介 ListView是Android系统中显示列表的控件,每个ListView都可以包含很多个列表项。 二、ListView的使用 概念不多说,直接来介绍使用方法。 ListView中比较复杂的是数据适配器,其作用是把复杂的数据(数组、链表、数据库、集合等)填充在指定视图界面,是连接数据源和视图界面的桥梁。常见的Android原生的适配器有ArrayAdapt
欢迎转载,转载请注明出处: http://blog.csdn.net/dmk877/article/details/51912104   相信不管做了多长时间开发的人都用过Tween动画,从刚开始工作到现在我也是用了N次Tween动画,但是每一次使用总感觉掌握的不够全面,所以花了点时间详细的总结了下Tween动画,其实在android中熟练掌握动画,能够帮助我们实现一些非常酷炫的效果从而使我们的app在交互或者用户体验上有一个更好的体验,鉴于此详细的学习动画还是很有必要的,相信通过本篇的学习大家会对Twe

Java(Android)回调函数详解 - 2016-07-23 17:07:29

一、前言 本周有位入行开发不久的朋友问我回调究竟是个什么概念,在网上看了很多的回调函数解释,但是越看越乱。虽然回调函数这个梗已经不新鲜了,这里还是用书面的形式记录下。 如果有了解的,就无需再看。 二、概念 概念上,这里引用百度百科的解释,如下: 回调函数就是一个通过 函数指针 调用的函数。如果你把函数的 指针 (地址)作为 参数传递 给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或

Android_聊天_表情 - 2016-07-23 17:07:26

接下来就进入聊天界面了,我的界面效果如下几个图所示: 这其中包括两个点:仿微信按住说话功能,表情管理 第一个,按住说话 按钮的功能,通过重写Button完成, /** * 控制录音Button * 1、重写onTouchEvent;(changeState方法、wantToCancel方法、reset方法); * 2、编写AudioDialogManage、并与该类AudioRecorderButton进行整合; * 3、编写AudioManage、并与该类AudioRecorderButton进行整合;

JAVA 面向对象 隐藏和封装 - 2016-07-23 17:07:20

本页面更新日期: 2016年07月22日 前言 在前面程序中,经常出现通过 某个对象直接访问其成员变量的情况. 这可能引起一些潜在问题,比如将某个 Person 的 age 成员变量直接设为 1000. 这在语法上没有任何问题, 但显然违背了当前的自然规律. 人怎么可能活到 1000岁 - - . (就现在的科学来讲) Java也考虑到了这种情况, 为你提供了 类和对象的成员变量 进行封装的方法,来保护成员变量不被恶意修改. 理解封装 封装(Encapsulation) 是面向对象的三大特征之一.(另外两
上一篇文章分析过DroidPlugin对Activity的处理过程,不得不为对DroidPlugin的工程师们钦佩不已,那么是不是Service可以像Activity的处理过程一样来处理呢?前面讲过每一个代理进程只是预定义了一个Service,如果某一个插件中有多个Service,那岂不是某一个时刻只能有一个Service运行呢?由此可以判定可能Service的处理和Activity不一样。 一方面:平时使用Activity主要是用于展示界面和用户交互,Activity的生命周期可能受用户控制,当用户操作

IntentService使用及源码分析 - 2016-07-23 14:07:58

IntentService使用及源码分析 转载请注明 原博客地址: http://blog.csdn.net/gdutxiaoxu/article/details/52000680 本篇博客主要简介一下三个问题: 什么是IntentService? 怎样使用IntentService IntentSerice()源码分析 1)什么是IntentService? 我们知道Service和Activity一样是Android的四大组件之一,Service简称为后台服务,具有较高的优先级别。我们平时在Activ

Android——ListView控件 - 2016-07-23 14:07:54

本篇介绍ListView控件,这是Android中比较重要也比较复杂的控件,这里只谈到使用ViewHolder机制优化即可。 一、ListView简介 ListView是Android系统中显示列表的控件,每个ListView都可以包含很多个列表项。 二、ListView的使用 概念不多说,直接来介绍使用方法。 ListView中比较复杂的是数据适配器,其作用是把复杂的数据(数组、链表、数据库、集合等)填充在指定视图界面,是连接数据源和视图界面的桥梁。常见的Android原生的适配器有ArrayAdapt