天龙八部粒子开发(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实现的内容如下:
这是粒子脚本中 boss_企鹅王_攻击01 粒子的实现效果
还有一个粒子的实现效果
要实现天龙八部的粒子效果, 需要写自己的粒子插件, 主要实现三个内容:影响器(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.0 , 0.0 , 0.0 , 1.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发射器, 具体实现还在猜测中
2 {
3 ParticleIterator pi = pSystem -> _getIterator();
4 Particle * p;
5 ColourValue colourValue( 0.0 , 0.0 , 0.0 , 1.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 }
这是粒子脚本中 boss_企鹅王_攻击01 粒子的实现效果
![](http://www.cppblog.com/images/cppblog_com/summericeyl/screenshot_3.png)
还有一个粒子的实现效果
转载自:http://www.cppblog.com/summericeyl/archive/2010/01/29/106696.html