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

天龙八部粒子开发(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.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发射器, 具体实现还在猜测中
这是粒子脚本中 boss_企鹅王_攻击01 粒子的实现效果

还有一个粒子的实现效果


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值