| 
积分13944注册时间2012-10-13最后登录1970-1-1在线时间 小时金币 枚资源币 枚现金 元性别保密 
 

   离线  | 
 
| 
《帝国时代OL》是2011年底微软发布的即时战略网游版,画面相当华丽。在它发布不久我就研究了它的场景实现方法,这篇文章里所写的内容是2012年1月份研究的,当时写了个场景查看工具,还带有简单的地表编辑功能,但是后来因为其他原因就不再继续下去了,所以也就放着不管了,前阵子整理硬盘才想起还有这段往事。很遗憾的微软已经停止更新《帝国OL》了,也就是前几天的新闻,但是服务器还没关,只是内容不再更新,其实不更新也就意味着离关服不远了。
×
注册,下载更多游戏资源!您需要 登录 才可以下载或查看,没有账号?立即注册 
  
 下面说说它的地表实现方式吧,跟目前流行的做法完全不同,算是自成一派。
 照例,一个场景(特指地表)由很多块(或者叫页)组成,每块都是8*8的格子,当然边缘可能不够8*8。每块由很多层组成,每层有三张贴图,一张diffuse,一张normal和一张mask, 示例如下:
 
 最右边的大图是最终的混合结果,这个是没有加法线的效果。
 理论上最多支持64层,当然显卡撑不住的,我记得统计过所有的场景,大概最高的是16层好像。
 
 Diffuse和normal比较好理解,这个mask是怎么来的呢?其实这个是实现的重点,下面详解。
 背景知识:
 1.帝国OL的场景文件是一种类似google protobuf的格式。里面有由很多贴图文件的名字,组成的数组,然后地图数据(长*宽个WORD值)就是这些贴图的索引。
 2.在Art.bar包中有个blends.txt,里面记录了两个信息,一个是各种Blender的类型,另一个是贴图混合的层级。层级是指贴图的顺序,比如雪地肯定在泥地之上等等。
 
 有了上面两个信息,我们通过如下方式就可以生成mask贴图了:
 1.    初始化为全白
 2.    每层独立处理,如果9宫格内没有本层的类型,则不处理
 3.    本层以上的不考虑
 4.    遍历低层的格子,按下图方式放置本层的blender
 
 
 
 通过上面的方式,就可以正确的生成mask了:
 
 看的一头雾水是吧,其实去下个帝国OL的客户端,然后拿帝国3的MOD工具就可以解包,看到那些文件就好理解了,我这里放几个截图,帮助您理解。
 blender看起来是这样的,就是一个个小贴图,32*32的。
 
 blends.txt的内容是这样的:
 Name newdefault
 Corner               1  blends\blendcorner
 Corner               1  blends\blendcorner2
 Edge                 1  blends\blendedge
 Edge                 1  blends\blendedge4
 Edge                 1  blends\blendedge5
 Edge                 1  blends\blendedge6
 Edge                 1  blends\blendedge7
 TwoEdges             1  blends\blendtwoedges
 LShape               1  blends\blendLShape
 LShape               1  blends\blendLShape2
 LShapeCorner         1  blends\blendLShapeCorner
 LShapeCorner         1  blends\blendLShapeCorner2
 TwoCorners           1  blends\blendtwocorners
 TwoOppositeCorners   1  blends\blendtwooppositecorners
 ThreeCorners         1  blends\blendthreecorners
 FourCorners          1  blends\blendfourcorners
 EdgeCorner           1  blends\blendedgecorner
 EdgeTwoCorners       1  blends\blendedgetwocorners
 UShape               1  blends\blendushape
 Circle               1  blends\blendcircle
 Circle               1  blends\blendcircle2
 Circle               1  blends\blendcircle3
 
 BlendOrder
 Roman\RetainingCliffEdge_df
 Roman\Road1_df
 Roman\Road2_df
 Greek\MudDirt01_df
 Egyptian\CliffDesertTop_df
 Greek\CliffCoastTop_df
 Greek\CliffInlandTop_df
 Celt\AlpsCliffTop_df
 Celt\RaidCliffSide_df
 Celt\RaidCliffTop_df
 Celt\CliffSide41_df
 Celt\CliffTop44_df
 Celt\CliffSide48_df
 Minoan\CliffTop51_df
 Minoan\CliffSide52_df
 Minoan\CliffSide51_df
 
 大概明白了吧。其实还有一个问题,从上的图可以看出,同一种类型的blender其实不只一个,每种类型都有4,5个,那生成地表的时候选择哪个呢?
 有几个推论:
 1.完全随机选择。不对的,因为每次进同一个场景,地表是完全一样的,不可能是随机的。
 2.地表里存了这些数据。我几乎把场景文件格式全解析出来了,但是非常确定的是场景文件里没有存这个信息。
 3.通过一种算法来选择。正解!我感觉类似随机算法,但是每次取值的时候,先设置下种子,目前可以确定的是,这个种子肯定跟格子的坐标有关。
 
 验证的方式很简单,把场景扩大一格,如果这一行或者一列是从原点开始的,则所有的blender都有变化,如果这一行或者一列添加在最后,则原地表不会变化。
 
 最终实现的结果:
 
 
 
 
 
 
 
 
 
 
 
 | 
 |