[圣二源代码导读.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[圣二源代码导读

圣二源程序导读 先声明:我不是本程序的作者(他们是soft,sea_bug),我只是负责后期修正程序工作的。不过,如果你想深入研究圣二的源代码的话,读读本文会对你有很大的帮助的。下面是我用了两个星期熟悉圣二所有的源代码的心得。 我拿到手的源代码里面是有不少的注释的,而且在你看到的源代码里面,我还加入了不少的注释,相信你能够一行一行的看懂的。我这里只是给你一个大概的轮廓的概念。 好了进入正题。 最前面说说圣二源代码的组织结构: \Fight\ 下面放的是战斗部分的程序 \MENU\ 菜单操作部分的程序 \GAMELIB\ 封装了DX的游戏库 \interface\ 游戏的界面:button,checkbox,window,scroll,procee,listwindow等 \MAPEDIT\ 地图编辑器的相关函数 下面看看圣二的整体结构:标准的win32程序风格 先初始化和游戏相关的数据,Ddraw,Dsound,Dmusic,Dinput然后开始消息循环,由一个叫RunGame的变量做为循环的条件,Peek方式,有消息的时候处理消息,在空闲的时候进行游戏主循环。主循环里面先进行延时控制,然后获取输入信息,再根据游戏状态(g_ePlayState)进行不同的处理,这些处理是放到不同的函数里面的,然后得到游戏的一些数据,再根据不同的游戏状态进行屏幕的更新,最后是一个被称为消息队列的东西执行它的一个叫做Run的函数。这个消息队列是由程序来维护的,不是windows的消息队列。设计这样一个消息队列是用来配合脚本的执行。从游戏主循环返回了后,又进行相同的循环,直到RunGame为false为止。这点是由程序控制的,正常情况下GetMessage是不可能得到WM_QUIT消息的。 上面就是整个程序的结构。 下面我们一个类一个类的分析。 先看最为基本的类CIniSet类,这个类贯穿整个程序,它负责游戏重要数据的组织。提供了对INI文件操作的支持。基本的用法是根据一个文件名filename一个索引名index一个数据名得到这个数据的具体的内容。这个类先根据给出的文件名建立一个索引列表IndexList 以后的操作都可以根据这个列表来进行,根据索引列表找到索引位置,再从这个位置开始搜索与给定数据名相同的字符串,然后返回其内容的位置,根据要求按照int或者是string进行处理。没有什么要多说的,程序里面有详细的注释,容易忽略的地方我都写了很多。 然后是Cmap类,不用说了地图类。想要完全看懂这个里面的函数,先要了解圣二的地图结构。圣二使用的是三层的地图,最下面是地面层(Ground),然后是两个物体层:物体层一(Obj)和物体层二(Obj2),地图的每个格子由一个叫stCell的结构描述,这个结构放在Map.h里面。它定义了地图格子的所有的属性:地面层,物体层1,物体层2的图片所在位置,它们的层次关系(这不是说它们之间的层次关系,而是和地图上的人物的层次对比关系),这个格子的阻挡属性,鼠标放上去的时候是显示什么样子的图形和这个格子的陷阱属性(就是人物走到这个位置将要发生的事件)。这个结构的定义使用了位段(bit field)的方式存放数据,当然是为了节省内存。(哇,好厉害的soft哦。我对你的佩服有如涛涛江水,绵绵不绝:)) 好了,不多说废话了,看看stCell的样子吧。 先解释下什么是页面,什么是编号。地图的图片是放到一些叫TILE的bmp(pic\tiles)中的,程序在运行的时候会把他们放到一个表面数组(*lpDDSMap)里面,然后把GroundPic这个做为数组下标访问数组得到这个地面元素所在的表面,然后根据Ground算出地面元素在这个表面的矩形位置。明白了吗?总结下,GroundPic是用来寻找表面的,而Ground是用来寻找矩形位置的。而且,所有的层次都是这样处理的。那么动态图片是怎么回事情呢?其实也是由静态元素按照一定的顺序组合来的,程序里面多了一层处理,你在显示地面的时候,只需要根据地面的TILE位置算出当前的动态地面的图片在哪个表面的什么位置,而图片动态显示的时候的更新是有专门的函数处理的。这样可以一次更新所有的动态图片的桢和记数。说到这儿就差不多了,看看程序里面的注释吧。 下面说说地图的显示。这儿的显示是要包括地图上面的人物的。怎么才能显示人物把建筑遮住和建筑把人物遮住的不同状态呢?这个问题就牵涉到层次问题。在地图结构中有两个层次相关的成员,就要靠它们来做到了。在地图编辑的时候会设置好两个层次变量的值。在显示地图的时候,先遍历需要显示的地图的范围里(为什么会有这种说法呢?因为有的时候

文档评论(0)

xiaoyi2013 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档