gamebryo本身是一款很好的引擎,强大之处有一点就是有一个所见即所得的3dMax导出插件,这样在他开发特效的时候,可以在3dMax中制作好,然后按照gb本身的方法导出就可以了。这时候得到的nif是一个静态的nif,要想在游戏中灵活的表现出来,需要有一个配套的配置文件和c++类来调用。
本文说下xml里面需要哪些格式,还有我们的c++里面需要做哪些内容。
我列出我的xml种有哪些内容:
<?xml version="1.0" encoding="GB2312" ?>
<Effect class="sdEffect" name="fffffp" effectType="SCENE" Speed="0.0000" Direction="0">
<Property>
<BirthPos>0, 0, 0</BirthPos>
<DelayTime>0</DelayTime>
<LifeSpan>10</LifeSpan>
<Texture></Texture>
<AlphaBlending>true</AlphaBlending>
<SrcBlendMode>0</SrcBlendMode>
<DestBlendMode>0</DestBlendMode>
<ZBufferTest>true</ZBufferTest>
<ZBufferWrite>false</ZBufferWrite>
</Property>
<Effect class="sdEfMesh" name="d" effectType="SCENE" Speed="0.0000" Direction="0">
<Property>
<BirthPos>0, 0, 0</BirthPos>
<DelayTime>0</DelayTime>
<LifeSpan>10</LifeSpan>
<Texture></Texture>
<AlphaBlending>true</AlphaBlending>
<SrcBlendMode>0</SrcBlendMode>
<DestBlendMode>0</DestBlendMode>
<ZBufferTest>true</ZBufferTest>
<ZBufferWrite>false</ZBufferWrite>
<MeshFile>苍炎诀热浪(2).nif</MeshFile>
</Property>
<Modifier class="sdModSize" cycleType="0">
<Keys>
<Key time="0.1059">0.033654, 0, 0</Key>
</Keys>
<Property>
<CycleType>0</CycleType>
<UIMinTime>0</UIMinTime>
<UIMaxTime>10</UIMaxTime>
<UIMinValue>0</UIMinValue>
<UIMaxValue>1</UIMaxValue>
</Property>
</Modifier>
</Effect>
<Effect class="sdEfMesh" name="ff" effectType="SCENE" Speed="0.0000" Direction="0">
<Property>
<BirthPos>0, 0, 0</BirthPos>
<DelayTime>0</DelayTime>
<LifeSpan>10</LifeSpan>
<Texture></Texture>
<AlphaBlending>true</AlphaBlending>
<SrcBlendMode>0</SrcBlendMode>
<DestBlendMode>0</DestBlendMode>
<ZBufferTest>true</ZBufferTest>
<ZBufferWrite>false</ZBufferWrite>
<MeshFile>手部燃烧特效006.nif</MeshFile>
</Property>
</Effect>
</Effect>
如上面看到的,这是一个xml文件中对于所包装的nif进行了很多属性上的封装,内容有,我们的特效名称,特效类型,特效在人物身上的节点名称,特效的方向。同时还有他的一些混合方式等等。
为什么要有这些内容哪?我们以一个静态的火焰效果为例,假设一个玩家释放一个火焰特效。那这个时候我们做了那些内容那?假设玩家播放一个施法动作,这个动作在总长度为3秒钟,他会在第二秒钟把火焰放在手上,然后在2.8秒钟火焰放出去,那么我们的特效相对于人物的这个动作播放时间就是2-2.8秒,特效的生命周期就是0.8秒钟,好了,但是我们的美术人员在制作特效的时候一般不会专门制作一个长度0.8秒的特效,一般他会制作一个首尾连在一起的火焰特效,火焰会一直循环播放。那这个时候我们在配置文件里就会写上这样的属性“2.0秒钟的时候开始,2.8秒的时候结束,特效在角色的手上部位播放,并且随着手的动而动”。因此就如上看到的那些个属性。另外会有一些特殊效果,比如想要特效在动作的某个部位突然变大,那么就要给动作加上修改器,如下。
<Modifier class="sdModSize" cycleType="0">
<Keys>
<Key time="0.1059">0.033654, 0, 0</Key>
</Keys>
<Property>
<CycleType>0</CycleType>
<UIMinTime>0</UIMinTime>
<UIMaxTime>10</UIMaxTime>
<UIMinValue>0</UIMinValue>
<UIMaxValue>1</UIMaxValue>
</Property>
</Modifier>
这个时候特效就会在0.1059秒钟的时候大小变为0.033654,在第0.3059的时候大小变为1.033654。中间我这里都是按照线性插值计算,当然也可以按照贝塞尔曲线插值等等。当然修改器有很多种类型,透明修改器,缩放修改器,旋转修改器等等。
xml的基本格式就是这些了,那么游戏中需要做哪些内容哪?接口很简单,得到特效,指定人物或者位置,播放。
我们开发一个特效管理类(cEffectManager),播放火焰那么getEffect 火焰,因为火焰特效在xml配置文件中已经指定了人物身上在什么位置播放,因此setnode(人物)就可以了。然后play。因为配置都在xml中了所以c++中控制播放的时候就很简单了。另外c++中一个很大的任务就是解析xml文件,然后把属性按照模块存放在不同的对象中。