2d地图:用3D思路方法实现2D斜视角地图



前言   2005年1月28日是我工作日中个灾难日硬盘挂了我曾经写那些工具小全部遇难其中包括地图编辑器所幸是有些工具软件Software我都Share在网上了没有办法只能将该编辑器重新写过也罢总是多花费个月左右时间来重新整理相信也会有收获步步来吧先整理个思路出来结束这段工作后代码也会Share出来

  人生不如意十有 8 9想开点总不能因此就做跳楼摸电门此类对不起生命动作来嘿嘿嘿



、斜视角地图介绍

  2D斜视角地图游戏多了去了例如角色扮演类型暗黑、即时战略类型突袭、模拟类型模拟人生、我说不清什么类型盟军敢死队游戏中大概是什么样子见以下抓图至于这些游戏的所以采用这种视角地图那就是开发公司能够回答问题了



  通过图例大家大概了解了什么是2D斜视角地图了吧(题外话:盟军敢死队地图制作思路方法我觉得最酷最炫但是对我来说太深奥了)我这里想去浓重介绍暴雪魔兽争霸3就是类似模拟人生2那种地图制作思路方法

  玩过看过魔兽争霸3朋友问了它不是3D地图吗?这里简单介绍说明其实我认为魔兽争霸3地图就是2D的所以看上去像3D效果只是貌似神合罢了实际上是用3D思路方法来实现2D场景我反倒是认为盟军敢死队看上去虽然是2D效果地图但是实际上它确是用2D思路方法来实现3D场景(题外话:看到此处如果你仍然认为魔兽争霸3是3D地图你我看问题角度区别请不要往下看了就此打住好了会越看越迷糊呵呵)



2、3D实现2D斜视角地图好处

A、 可以全方位转来转去调整视角视觉效果酷而且晚上白天变化处理也很轻松

B、 遮挡关系处理简单纯2D总是要处理物件的间关系有点复杂

C、 微软DX新版本已经不建议使用DDraw 了Opengl 直都好像是3D代名词

D、 方面比纯2D来实现代码量少且简单美术方面工作量要少整体费用上开源节流阿





3、3D实现2D斜视角地图坏处

  E~Z都是这里就不介绍了主要还是介绍好处坏处说多了偏离主题了嘿嘿嘿



4、3D实现2D斜视角地图制作

  既然是用3D思路方法来构建2D地图你至少要先了解有关D3D或者OGL些乱 7 8糟以及些基本3D知识

A、 建立网格地表

好比是256*256个网格吧每个网格是2个 3角成组成就是看上去马平川那种如图:



  我放了个小人在地图中可以看出这张地图大小还算不错等待今后全部完成该这张地图后当让真正该地图时若在P4-2.5G机器上总耗时不会超过1秒钟如果有时间优化应该还能够快用过这个地图编辑器朋友应该知道该地图文件平均在250k左右大小就能够描述了 需要分为两个步骤解释

1、 为这些网格建立个结构来描述大体上应该是这样


struct T_TERRAIN{

float fx,fy,fz;//存储每个网格点位置和高度高度化为0

float fNormalx,fNormaly,fNormalz;//存储每个网格点法线数据

};


T_TERRALN* pTerrain = T_TERRALN[257*257];//注意为什么是257呢在<wc3>编辑器中建立张256*256地图实际上就是建立个257*257大小地图当然没有必要这样做我这里只是便于统变量避免混淆而已


存储顺序是左下角为x=0,y=0横向(宽度)方向每个格子跨度为128.0f


个步骤结束这就拥有了个基本地形数据当然你可以现在就用这些数据将其按照网格方式渲染出来当然如果使用实体方式就是白板块了如果想表现如图所示接着进入下给网格贴图



  这里需要解释下为什么地形中我们需要高度z呢?不是说好了是2D地图吗?用z就是让地图今后有高低起伏效果实际上z在游戏中没有任何用途例如游戏中两个人距离判断只是需要x和y不管z事情



2、 为地形贴图先展示以下我们需要什么样图素呢?




  实际上这是张带通道tga 图片为了方便理解我转换成2张了张是效果图片第 2张是通道图片图片大小为512*256每64*64为个网格使用图素其中右边片是为了表示地图好看随机抽取图素当然如果需要考虑贴图所占用资源右边也可以不要
  从通道贴图很容易看出这些贴图意味着它将贴在什么位置做什么用见图:



  诺大个“ 6”字应该能够分辨出它对应关系了吧例如“ 6”字那个点右上角对应通道从上往下从左往右坐标为03贴图其他就不用解释了

  这些贴图你当然可以制作成为个个分解后贴图不过就显得有些浪费了暴雪的所以将其做成张图片当然出了节省外还有当地图地表自动拼接时候贴图间相互叠加融合这样摆放思路方法就显得格外精巧煞费苦心了





现在知道了这些地表图素样式了我们就需要给那些顶点付UV值了


Struct T_UV{

Float fu,fv;

};



T_UV* pUV = T_UV[257*257*N];

注意这里为什么需要*N呢?这个N是什么东西呢?这个还是放在以下章节来说吧[滞后问题1]我们先假定N是1这样就好理解了吧

然后给这些顶点设置相应uv 值



至此这些数据足以渲染张平板地图生成了“ 6”字贴图这样不算哦

B、 让地图看高低起伏起来

就是托拽这些顶点修改这些顶点高度数据Z注意千万不要修改x和yx和y永远是固定

以下介绍个简单思路方法只拉动其中个顶点如图:



也分为2步骤 1、 确定是打算提升地表高度呢?还是打算降低地表高度

2、 在场景中拾取这个点找到这个点然后左右晃动鼠标拼命修改z+/-直到这个点极限注意在这种地图编辑器中该点不是无限拉高或者降低这里极限高度是周围8个点平均高度128.0f也就是个步长了



注意修改顶点同时不要忘记计算法线了现在开始将该地图各个点高度通乱改重新再看这个地图就变成这样了[注意我这里是重新生成]



C、 地表贴图[上文提到那个滞后问题1解]

上文提到有关uv 那个N变量问题
T_UV* pUV = T_UV[257*257*N];


wc3地表变化多样(般是7-8种但是理论上无穷无尽)然后拼凑起来如上图经过分析我们可以知道地图没个顶点最多有可能需要保存4种效果图素uv 为什么我这里用N了N表示可能有多少种贴图我这样做只是方便解释正式代码时候可千万别用这种存储方式超级浪费了



用该张抓图来说吧0123网格里面用了 4张图素假定为ABCD 4张贴图实际上在画这个网格时候共需要画4遍 就是A贴图画这个2个 3角形B贴图画这个2个 3角形C贴图画这个2个 3角形D贴图画这个2个 3角形



  在<wc3>中是需要根据贴图顺序来画网格就是说假定游戏中用到了8种地表贴图顺序安排是ABCDEFGH时候种种按照顺序来画你也可以将其理解为photoshop 中层概念

  当然在渲染地图时候需要剪裁就是不在摄像机视角范围内就不要画了此种地图我觉得用 4叉树就可以了简单又方便当然还有其他更多更好剪裁思路方法根据需要自己决定吧



D、 摆放物品



每个物件就是模型文件将其放在合适xy 上就可以了z是根据地表z计算得出 在摆放物件时候还需要生成障碍点就是标示那些地方能走哪些地方不能走标志


Struct T_OBPOINT{

U8 btWalk;

};

U8* pbtWalk = u8[257*4*257*4];


的所以*4是<wc3>障碍点设置是将每个网格细分长宽各4这样做有个好处就是游戏中不需要和物件进行3D碰撞检测了至于每个物品障碍范围是在配置文件中写好





E、 砌墙凿洞



这个和放置物品几乎是不过这个墙这个东西这个需要考察美术人人员能力了我抓了几个模型做图解可以不难理解这个和地表图素做法几乎

注意当地表4个顶点不时候这些墙模型顶点也是是需要进行转换就是依次根据4个点作为影响因子对墙模型顶点进行转换就好比布被风吹动那种效果思路方法网上有很多这样资料介绍 下篇将用wc3地图文件格式来介绍如何高效率存储读取个地图文件



末了给自己无聊做着玩游戏做个广告原本打算春节释放但硬盘Over了工作时光倒流还是请各位期待






Tags:  奇迹3d视角 3d视角 2d地图编辑器 2d地图

延伸阅读

最新评论

发表评论