知易游戏开发教程cocos2d-x移植版007
2012-06-10 21:12
337 查看
在新的一章中,知易带来了粒子系统的相关知识。如果你不清楚粒子系统到底是怎么一回事,那就赶快来看一下吧。
粒子系统是计算机图形学中模拟模糊现象的技术之一。一般来说,为了表现某一现象,会有大量的微小粒子被创建出来。从宏观上讲,这些粒子是一个整体,它们是确定的可控的;从微观上讲,这些粒子各自为战,每一个个体都保持着自身的随机性。
粒子系统能让你的玩家眼前一亮,整个游戏都灵动起来。
维基百科上写的是William "Bill" Reeves,论文上署名的是William T. Reeves,我想应该是同一个人吧,卢卡斯影业的大牛,皮克斯的创始员工之一。
有兴趣的朋友可以去拜读一下大师的文章,十多页,我水平有限,看得很慢,只看了个开头。
http://blog.sina.com.cn/s/blog_537cabb80100i0qu.html
或者老G的学习笔记14
http://4137613.blog.51cto.com/4127613/767801
让我们跳过枯燥的原理和参数介绍,关注最基本的使用。
使用这种方法的缺点是我们不能指定粒子的数量,因为它在init内固定了这个值。
此外,这里还涉及到cocos2d-x中对象生命周期的管理。
如果你使用方法一,并将创建的对象保存在成员变量中,那么需要调用retain来避免其自动释放掉,并记得在不用的时候调用release来释放。
如果你使用的是方法二,你要时刻记住“谁申请谁就负责释放”的原则。不过对于这些CCObject对象,请使用release来代替直接delete掉,因为它可能不止一份引用。
示例7
在上一个示例的基础上,我们只做两处更改,给敌方坦克的炮弹增加烟雾效果,给我方坦克的炮弹增加火焰效果。
都是非常简单的调用,如果遇到问题,可以参考我上传的代码。
http://files.cnblogs.com/cocos2d-x/ZYG007.rar
为什么需要粒子系统
在示例6中,我们通过一组图片实现了炮弹的爆炸效果,这是游戏开发中常见的表现手法之一,它的理论基础就是动画。但是如果我们希望模拟更加真实的效果,比如烟雾、闪电、雨雪、火焰等,我们就需要使用另外一个工具——粒子系统。粒子系统是计算机图形学中模拟模糊现象的技术之一。一般来说,为了表现某一现象,会有大量的微小粒子被创建出来。从宏观上讲,这些粒子是一个整体,它们是确定的可控的;从微观上讲,这些粒子各自为战,每一个个体都保持着自身的随机性。
粒子系统能让你的玩家眼前一亮,整个游戏都灵动起来。
科普一下
1983年先驱William T. Reeves在《Computer Graphics》上发表了《Particle Systems: A Technique for Modeling a Class of Fuzzy Objects》一文。他向人们介绍了在《Star Trek II: The Wrath of Khan》中使用的粒子系统,被认为是最早掌握此系统的人之一。维基百科上写的是William "Bill" Reeves,论文上署名的是William T. Reeves,我想应该是同一个人吧,卢卡斯影业的大牛,皮克斯的创始员工之一。
有兴趣的朋友可以去拜读一下大师的文章,十多页,我水平有限,看得很慢,只看了个开头。
使用粒子系统
额,这方面的知识还真是繁杂啊,为了避免一知半解误导大家,所以关于粒子系统的详细介绍请参看知易原教程第7章http://blog.sina.com.cn/s/blog_537cabb80100i0qu.html
或者老G的学习笔记14
http://4137613.blog.51cto.com/4127613/767801
让我们跳过枯燥的原理和参数介绍,关注最基本的使用。
1)基本用法
像其他类一样,cocos2d-x的粒子效果类也提供了静态函数以方便我们创建其实例。emitter2 = CCParticleSun::node(); emitter2->retain(); emitter2->setTexture(CCTextureCache::sharedTextureCache()->addImage(s_fire)); emitter2->setPosVar(ccp(3, 3)); emitter2->setStartSize(20.0f); emitter2->setStartSizeVar(2.0f); emitter2->setEndSize(0.0f); emitter2->setEndSizeVar(0.0f); ccColor4F endColor2 = { 0.0f, 0.0f, 0.0f, 0.1f }; emitter2->setEndColor(endColor2); emitter2->stopSystem(); addChild(emitter2);
使用这种方法的缺点是我们不能指定粒子的数量,因为它在init内固定了这个值。
class CC_DLL CCParticleSun : public ARCH_OPTIMAL_PARTICLE_SYSTEM { public: CCParticleSun(){} virtual ~CCParticleSun(){} // 使用node方法创建的对象实例默认350个粒子 bool init(){ return initWithTotalParticles(350); } virtual bool initWithTotalParticles(unsigned int numberOfParticles); static CCParticleSun * node() { CCParticleSun *pRet = new CCParticleSun(); if (pRet->init()) { pRet->autorelease(); return pRet; } CC_SAFE_DELETE(pRet) return NULL; } };
2)更灵活的应用
为了定制粒子的数量,我们会使用另外一种方法:emitter2 = new CCParticleSun(); emitter2->initWithTotalParticles(250); emitter2->setTexture(CCTextureCache::sharedTextureCache()->addImage(s_fire)); emitter2->setPosVar(ccp(3, 3)); emitter2->setStartSize(20.0f); emitter2->setStartSizeVar(2.0f); emitter2->setEndSize(0.0f); emitter2->setEndSizeVar(0.0f); ccColor4F endColor2 = { 0.0f, 0.0f, 0.0f, 0.1f }; emitter2->setEndColor(endColor2); emitter2->stopSystem();
3)第三种方式
还有一种方式,那就是使用粒子编辑器来创建粒子效果文件。我还没有尝试过这种方法,只能以后再补充啦。注意事项
需要注意的是,无论使用哪种方式来创建粒子效果对象,请确保设置了纹理,否则渲染时会崩溃。此外,这里还涉及到cocos2d-x中对象生命周期的管理。
如果你使用方法一,并将创建的对象保存在成员变量中,那么需要调用retain来避免其自动释放掉,并记得在不用的时候调用release来释放。
如果你使用的是方法二,你要时刻记住“谁申请谁就负责释放”的原则。不过对于这些CCObject对象,请使用release来代替直接delete掉,因为它可能不止一份引用。
小结
虽然繁杂的参数稍稍变动可能就有一个新的效果,但是不要有任何心里负担,你要坚定信心,常用的就那么几个,用的多了自然就会得心应手。粒子系统中不同效果的使用方法是相通的,即便是一个没用过的新效果,只要稍微学习一下,也可以立马上手的。示例7
在上一个示例的基础上,我们只做两处更改,给敌方坦克的炮弹增加烟雾效果,给我方坦克的炮弹增加火焰效果。
都是非常简单的调用,如果遇到问题,可以参考我上传的代码。
http://files.cnblogs.com/cocos2d-x/ZYG007.rar
相关文章推荐
- 知易游戏开发教程cocos2d-x移植版007
- 知易游戏开发教程cocos2d-x移植版002
- 知易游戏开发教程cocos2d-x移植版004
- 知易游戏开发教程cocos2d-x移植版001
- 知易游戏开发教程cocos2d-x移植版002(上)
- 知易游戏开发教程cocos2d-x移植版002(下)
- 知易游戏开发教程cocos2d-x移植版002(上)
- 知易游戏开发教程cocos2d-x移植版003
- (转)知易游戏开发教程cocos2d-x移植版004
- 知易游戏开发教程cocos2d-x移植版004
- 知易游戏开发教程cocos2d-x移植版005(上)
- 知易游戏开发教程cocos2d-x移植版005(上)
- 知易游戏开发教程cocos2d-x移植版002(下)
- 知易游戏开发教程cocos2d-x移植版001
- 知易游戏开发教程cocos2d-x移植版002(下)
- 知易游戏开发教程cocos2d-x移植版002(上)
- 知易游戏开发教程cocos2d-x移植版005(下)
- 知易游戏开发教程cocos2d-x移植版004
- 知易游戏开发教程cocos2d-x移植版
- 知易游戏开发教程cocos2d-x移植版003