基于gamebeyo的游戏特效编辑器

1649 篇文章 12 订阅
1277 篇文章 12 订阅

   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文件,然后把属性按照模块存放在不同的对象中。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值