Ogre-天龙八部粒子插件的实现(1)

来源:互联网 发布:定音器软件下载 编辑:程序博客网 时间:2024/04/28 11:22
天龙八部粒子开发(1)
要实现天龙八部的粒子效果, 需要写自己的粒子插件, 主要实现三个内容:影响器(Affector), 发射器(Emitter), 粒子渲染器(Renderer)
1. 实现粒子插件
由于这些天龙八部的粒子效果是用插件的形式, 所以可以自己建立一个win32 dll工程, 然后需要用到的时候在plugin.cfg文件里加上这个dll文件就可以了
注意工程属性的C++/预处理器/预处理定义要增加以下几个预定义: USRDL;OGRE_PARTICLEFXPLUGIN_EXPORTS

2. 根据Ogre源码的插件部分实现自己的粒子插件
仿造Ogre源码的Plugin_ParticleFX工程中的OgreParticleFXPlugin.h, OgreParticleFXPrerequisites.h, OgreParticlFX.cpp, OgreParticleFXPlugin.cpp文件搭建这个工程的框架
TLBBOgrePluginFX.cpp 里面主要是提供被Ogre加载卸载时调用的函数dllStartPlugin和dllStopPlugin
OgreParticleFXPlugin.h, greParticleFXPlugin.cpp里面最重要的函数是install(), 用来创建新增加的影响器和发射器
OgreParticleFXPrerequisites.h 用于声明新创建的类

3. 影响器(Affector)的实现要点
创建每一个影响器都要有一个Affector.h, Affector.cpp, AffectorFactory.h文件
在Affecor.h和Affecotr.cpp文件中创建ParticleAffector的派生类, 用于从脚本中读取该影响器的各个参数, 然后重写_initParticle函数初始化各个粒子, 重写_affectParticles函数设置每帧粒子的变化
这两个函数的内容, 要根据游戏里该粒子的实现效果来猜测, 我程序中的ColourFadingAffector实现的内容如下:
 1     void ColourFadingAffector::_affectParticles(ParticleSystem* pSystem, Real timeElapsed)
 2     {
 3         ParticleIterator pi = pSystem->_getIterator();
 4         Particle *p;
 5         ColourValue colourValue(0.00.00.01.0);
 6 
 7         mTotalTime += timeElapsed;
 8 
 9         if (mTotalTime < mTime0)
10         {
11             colourValue = mColour0;
12         }
13         else if (mTotalTime < mTime1)
14         {
15             colourValue = mColour0 + (mColour1 - mColour0) * ((mTotalTime - mTime0)/(mTime1 - mTime0));
16         }
17         else if (mTotalTime < mTime2)
18         {
19             colourValue = mColour1 + (mColour2 - mColour1) * ((mTotalTime - mTime1)/(mTime2 - mTime1));
20         }
21         else if (mTotalTime < mTime3)
22         {
23             colourValue = mColour2 + (mColour3 - mColour2) * ((mTotalTime - mTime2)/(mTime3 - mTime2));
24         }
25         else if (mTotalTime < mTime4)
26         {
27             colourValue = mColour3 + (mColour4 - mColour3) * ((mTotalTime - mTime3)/(mTime4 - mTime3));
28         }
29         else if (mTotalTime < mTime5)
30         {
31             colourValue = mColour4 + (mColour5 - mColour4) * ((mTotalTime - mTime4)/(mTime5 - mTime4));
32         }
33         else
34         {
35             colourValue = mColour5;
36         }
37 
38         while (!pi.end())
39         {
40             p = pi.getNext();
41             p->colour = colourValue;
42         }
43     }
现在已实现了ScaleInterpolator, ColourFading, Movement影响器. 下一步写PolarEmitter发射器, 具体实现还在猜测中
这是粒子脚本中 boss_企鹅王_攻击01 粒子的实现效果

还有一个粒子的实现效果


转载自:http://www.cppblog.com/summericeyl/archive/2010/01/29/106696.html

原创粉丝点击