游戏通用开发工具图形部分的处理图块库的结构图块库由图块索引和图块内容两部分构成因为图块的字节长度是不固定的图块索引的结构每个索引的长度为一个图块内容的结构的图块信息头图块的宽度以点阵来计算图块的高度以点阵来计算图块在方向相对于绝对位置的偏移量图块在方向相对于绝对位置的偏移量长度不固定的图块内容其结构是以行为单位进行处理的它的每一行的结构画这一行需要阅读多少字节不定长度的线段内容它的每个线段内容的结构相对于上次位置的偏移量这个线段共需要画多少个字节这个线段的具体内容阅读图块的语言算法输入参数图块将展开成像素格式到这个目的缓冲区内包含了这个图块的图块信息头画这一行应该阅读多少字节每个线段所用掉的字节数目前画过的线段已经用掉的字节数当前的线段应该画在的位置相对于本图块的绝对位置因为是连续的内存不分宽度和高度的需要一个变量来计算画点到的偏移量指向本图块的开始位置的指针实际需要画的行数接收的宽度是为了兼容标准位图的标准格式在这里可以认为等于取得画这一行应该阅读多少字节指针指向了第一个线段的偏移量局部变量的初始化进行循环直到该画的字节都画完取得即将画出的线段的偏移量指针指向了即将画出的线段的实际字节数取得即将画出的线段的实际字节数指针指向了即将画出的线段的实际内容计算应该拷贝到的那个位置到的内存拷贝计算已经画出的线段用了多少字节指向下一个即将画出的线段标准位图是从最后一行开始算起的注意只是为了说明图块的解码方法对于转化成标准内存位图需要宽度边界的判断对于直接写入屏幕缓冲区还需要进行是否超过缓冲区边界的判断阅读图块库的类的数据和函数成员把指定编号的图块输出成标准位图格式装载图块库到内存关闭图块库图块库文件存盘设置图块所用到的调色板文件取得当前图库所用的调色板取得当前图库中图块的数量把指定编号的图块输出成指定大小的标准位图缩放把指定编号的图块输出成与原来图块大小相同的标准位图取得指定编号的图块的信息把一个标准的位图加入图块库中成为一个图块从图块库中删除指定位置的图块需要改进的地方原来是由这个类自己管理一个调色板文件在使用后需要改成兼容的调色板结构增加两个图块库之间的大量图块的直接拷贝提供把图块直接画在由指针指定的内存中的功能就象直接画在屏幕上一样实际上传递给它的指针很有可能就是屏幕的背后缓存的指针地图数组文件的结构内部地图数组文件由场景索引和场景地图两个部分组成场景地图的长度可以是固定的也可以是不固定的场景索引结构每个场景索引的长度为一个场景地图结构地图分成几个层来画一是为人物的移动提供了判断依据二是为使某些物体具有透明的属性同时也造成了三维空间的假象即下面的层会被上面的层遮盖地面将把这一层的数组全部填满因为地面是一直铺满整个地图的包括草地土地水但是不包括任何阻挡人物行走的石头和草建筑包括房屋花草树木桌椅板凳任何带有高度的物体在这一层中有物体的地方将填写相关物体的图块索引号没有物体的地方将用字节来填写最终所有的人物在计算了移动位置以后也将并入这一层根据人物将移动的方向的字节是否为零来判断人物移动的可能性如果增加某些有生气的动物也将并入这一层同样是计算了位置改变以后摆设包括桌子上摆的东西墙上挂的装饰品仅仅是为了画面的华丽程度加入这一层的原因是因为摆设物品的位置和所依附的物体的坐标往往是相同的也许只是为了减少一些图块但是增加了两个很大的矩阵建筑图块的偏移量因为所有的图块并不是很规则的为了在画面上使它们紧凑地排列在一起而加入了这个数组摆设物品的偏移量作用同建筑图块的偏移动画和事件触发标志定义了在地图上需要进行动画和什么地方将有事件发生的数组在地图里它们的标志是相同的有这种标志的地方填写了事件的索引号没有的地方用来填写因为事件的索引号有可能是因为地图是随着人物的走动和时钟的进行不断改变的范围和某些动画这些标志将作为动画处理和事件发生的判断依据无论如何事件的发生是和地图想关联的它们都有自己固定的位置不断打算盘的客栈老板和飘扬的旗帜流动的水都将来源于这些标志改进建议数组的大量填零造成空间的很大浪费对于物体的显示可以采用绝对位置加索引号来表示显示倒不成问题但是对于人物移动可能性的判断就变得很困难是否可以采用某种链表结来进行判断总的说来是要用时间来换取空间还是用空间来换取时间如果在链表结构上处理得非常杰出时间损失很小是最好不过的了物体的偏移量的信息是否可以包含在图块本身的数据结构里似乎影响不是很大经过仔细观察带有偏移量的原因有两个一是对于规则大小的图块需要摆在图块的中央显得好看二是一些不规则的家具一件家具往往是由几个图块拼凑起来的如果没有适当的偏移会出现裂缝但是为什么是拼凑起来的因为一个家具可能会在不同方位出现不同的人物比如坐在桌子旁边的令狐冲的形象是和桌子的那一角画在一起的反正认为能够很自由地在桌子前面站起来坐下于是很大的难题原来游戏采取屏幕变黑来处理偷懒了动画和事件的触发能不能分开来写这些标志是和判断人物行走无关的也许优化的可能性是最大的算法相对简单一点地图显示和运行的基本算法这部分的程序应该是比较关键的程序的大部分时间都将在地图的显示移动和变化状态中原来我的程序结构是把事件的处理加入了地图显示的循环就是坏惺录赝急旧淼难方岵佟欠裼貌扇拖姆式还值得仔细探讨指向所有数组的指针这些数组连续放在一起指向地面数组的指针指向建筑数组的指针指向摆身数组的指针指向动画和事件标志的指针指向建筑物体偏移的指针指向摆设物体偏移的指针指向动画和事件解释文件的指针提供给外部以下三个函数指定场景的初始化输入参数场景的编号打开并读入需要的图块文件打开并读入需要的图块索引文打开并读入指定场景号码的地图数组文件打开并读入指定场景号的动画和事件解释文件格式随后介绍指定场景的运行输入参数场景的编号以自己扮演的角色为标准的人物位置角色需要显示的当前桢包括了面对的方向程序循环和退出场景的标志场景在屏幕左上角的那个图块在地图数组中的位置需要显示的当前桢一般为零人物初始位置人物初始位置根据场景的不同而不同根据初始人物位置和场景位置画出场景循环直到接到退出指令获取用户的输入转化成标准消息结构处理消息事件重新刷新屏幕清除消息队列关闭指定场景清除屏幕关闭所有文件释放所有内存以下函数是上面三个函数需要调用的不公开函根据角色的位置和时钟重新刷新屏幕输入参数场景在屏幕左上角的那个图块在地图数组中的位置人物的当前位置人物需要显示的当前桢清除屏幕背后缓存区画地面把主角合并到建筑那一层把其他角色合并到建筑那一层显示建筑层显示摆设层计算是否走到了出口把背后缓存传送到屏幕处理消息队列来计算位置的变化键盘事件处理键盘事件方向键处理人物的移动如果可以移动没有障碍计算位置计算方向计算当前显示桢激活菜单处理用户呼叫菜单决定如果存在事件则执行它时钟刷新计算动画的显示存在的问题对于多个物体时间有差别的动画问题是不是把时钟的控制单位定小一点给每物体单独分配一个控制时间的变量搜索链表对于时间是否包含在场景循环内还是以发送消息的方式交给其他的函数来处理原来的方式是对应每个场景都有一个单独的图块库如果采取所有场景共用一个图块库应该如何在初始化的时候加载当前场景所需要的图块如果是另外记载需要的图块装入内存以后是否要重新建立索引设想共有的图块库为当前场景需要的图块为在加载的时候重新建立一个对应于当前内存中图块库的索引在一边挑选图块的时候这个索引就一边建立起来了在图形部分需要做的工作尽快指定合理的解决方案解决上面的问题一个可以重用的类一个图块编辑器一个地图编辑器场景运行程序的基本构架一个可重用的类盗亦有道如何从别人的游戏学习经验选定一个游戏来对他的文件组织结构进行比较深入的分析无疑是得到这一类型的游戏制作经验的捷径据说有名的赤壁就是前导公司仔细剖析了魔兽争霸做出来的以下结合对智冠出品的金庸群侠传的剖析介绍一下我是怎么样从别人的游戏里学习经验的也许是因为智冠许诺给河洛制作组的工作是时间太短的原因我从来没有见到过文件格式如此透明的游戏了能够遇到这样一个游戏并从中学到很多有关游戏的编程经验也为剖析其他游戏积累经验当属于三生有幸但是剖析游戏切忌陷入牛角尖的误区时刻牢记我们剖析游戏的目的和初衷我们仅仅是为了从中学习一些经验并不是真的要把这个游戏的每一比特的含义都搞懂而且深入剖析一个游戏以后等于已经掌握了它记录图象信息存储的文件格式对于那些暂时找不到美工又急于制作引擎的业余游戏编程爱好者说也暂时提供了用来实验的图象素材而且比用屏幕捕捉程序截取的图片完整得多剖析金庸群侠传的步骤确定每个文件的用途查看游戏文件目录根据自己的找出自己熟悉的文件比如一看到马上就明白了是声卡的设置程序嘛凡是在下做的游戏大多数有这个文件同时也就确定了是声卡的和声音的驱动程序是游戏的音乐是程序的音效还有一些是根据自己的编程经验一眼就能看出来的个字节的那个文件肯定是记录的系统色调色板的这样就可以排除掉很多文件剩下的就是游戏开发小组自己定义的文件格式了有一些文件的文件名起得非常好好到一眼就可以确定他是干什么的程度比如和就是嘛所有的内部场景嘛当然就是索引了和当然是人物的头像了至于是否想法正确可以用下几步的方法来验证利用改变文件名的方法来确定一些文件的作用把等待验证用途的文件改成其他名字而人为地给引擎制造一些错误对于一个好的游戏引擎应该有比较好的容错性和稳固性或者会给出文件找不到的信息这种方法对那些在游戏初始化已经完成后期才加载的文件尤其灵验但是用这种方法有时可能会死机为了祖国的游戏事业几次有啥子大不了的嘛那么我们就坐下来大骂这个游戏的引擎做得太差劲了好了比如我们在游戏目录下看到如下的文件我们根据名字猜测它们是和大地图地图有关的文件那么我们就把改名成然后运行游戏看看会发生什么错误谢天谢地没有死机但是走出去一看大地图上所有的地面不包括道路植物和建筑都变成单一的蓝色了这就说明这个文件记录的是大地图上地面的图块的排列利用同类文件交换文件名来确定文件的用途在这个游戏里有和这样的文件文件名比较简单很难确定它到底是保存的图块还是场景中图块的排列顺序但是正好这种同类的文件很多这个时候可以采取这种办法把的文件名与对调一下具体过程不用说了吧然后运行游戏咦没有变化一个不小心走进了河洛客栈噎河洛客栈什么时候重新装修过了布局没有改变只是构成场景的图块改变了这就说明这几个文件记录的是图块本身的信息用这种办法同样容易死机别怪我没有事先警告你猜测验证每个文件的结构对每个文件在游戏里的作用搞清楚以后接下来就是最艰巨的任务了搞明白每一个文件的格式根据索引查找规律把要搞懂的文件用或者其他可以查看二进制文件的工具显示在屏幕上看看有没有什么规律可以看到凡是索引文件都是由很有规律的整数或者长整数按顺序排列的根据这些索引可以确定其相应被索引的文件的每段数据然后再仔细比较被索引文件的每一段数据有什么不同就可以找到其中的规律了把文件用零填充来查找规律有些数据的单元长度不好确定可以采取这种方法比如记录图块的文件我们并不知道图块的每一行应该有多少个字节这时我们可以修改指定位置的图块的数据尝试用来填写几个字节然后运行游戏观察结果用修改文件数据来查找规律用法和第二项相同只是不填成而是用其他的数字来填充有时是一个关键的字节比如代表位置的有时是一串字节来寻找每个字段的含义为了效果更显著可以把数字改得夸张一点但是不要怕死机哦用自己编写的程序来调用游戏的数据为了验证数量很多的文件格式的正确性就要自己写一些程序因为我们不能老是一个字节一个字节地来寻找验证规律啊比如在初步对图块文件的格式有所了解之后就可以用自己的程序把它们显示在屏幕上尝试用自己编写的引擎来做个类似的游戏当你对一个游戏了解到这种程度以后有什么想法对了那就是尝试一下自己做一个类似的游戏什么你说还是有很多的文件格式没有彻底搞懂请不要忘记我们原来的初衷我们只是想通过剖析它来看一下这种游戏到底是怎么做出来的比如在这个游戏中的是记录游戏所有发生的事件的文件而我只搞懂了几种事件的记录方式但是我们也可以自己来定义自己的事件文件啊干吗非要把它搞得那么透彻反正最后的事件文件还不是要重新来写的找不到美工音乐吗暂时先用它原来的场景和音乐凑合一下吧如果你的引擎真的已经达到了原来引擎的水平还发愁没有好的美工音乐编剧和你合作