使用VB.NET开发2D游戏的全面讲解_第1页
使用VB.NET开发2D游戏的全面讲解_第2页
使用VB.NET开发2D游戏的全面讲解_第3页
使用VB.NET开发2D游戏的全面讲解_第4页
使用VB.NET开发2D游戏的全面讲解_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 上海电视大学 毕业设计论文毕业设计论文 毕业设计(论文)题目:毕业设计(论文)题目: 使用 vb.net 开发 2d 游戏的全面讲解 分校(站、点): 国顺 年级、专业: 二年级、计算机实用技术专业 教育层次: 专 科 学生姓名: 翁阳 学 号: 067001683 指导教师: 陈海建 完成日期: 2008-5-26 使用vb.net开发游戏全面详解 第 1 页 共 25 页 目录 内容摘要内容摘要.3 3 序:什么是游戏序:什么是游戏.4 4 一、一、2d2d 游戏的简介游戏的简介 .5 5 (一)(一)2d2d 游戏的种类游戏的种类 .5 (二)(二)2d2d 游戏的魅力游戏的魅力 .6

2、 (三)(三)2d2d 游戏的弊端游戏的弊端 .7 (四)当前成功的(四)当前成功的 2d2d 游戏游戏.7 二、二、2d2d 游戏开发简介游戏开发简介 .7 7 (一)(一)2d2d 游戏最基本的原理游戏最基本的原理 .7 (二)(二)2d2d 图片绘制常用方式图片绘制常用方式 .7 (三)当前游戏开发流行的编程语言(三)当前游戏开发流行的编程语言.8 (四)(四)vb.netvb.net 开发游戏行吗开发游戏行吗 .8 三、三、managedmanaged directxdirectx 入门入门.8 8 (一)(一)2d2d 游戏开发需要学到的游戏开发需要学到的 mdxmdx 技术技术 .

3、8 (二)(二)mdxmdx 的术语的术语 .9 (三)(三)2d2d 开发中必须了解的开发中必须了解的 3d3d 知识知识 .9 (四)使用最多的(四)使用最多的 mdxmdx 类:类:s spriteprite.9 四、四、vb.netvb.net 适合游戏开发的语义适合游戏开发的语义 .1010 (一)养成好的编程习惯(一)养成好的编程习惯.10 (二)(二)vb.netvb.net 垃圾回收机制垃圾回收机制 .10 (三)(三)vb.netvb.net 中类的单向继承中类的单向继承 .10 (四)(四)vb.netvb.net 中类的多向继承中类的多向继承 .11 (五)强悍的虚无(五

4、)强悍的虚无.13 (六)(六)vb.netvb.net 与与 c+c+ 语义上的比较语义上的比较 .15 五、封装五、封装 managedmanaged directxdirectx 构建自己的构建自己的 2d2d 引擎引擎 .1616 (一)引擎必备系统(一)引擎必备系统.16 1.1.绘制图片系统绘制图片系统.16 2.2.音效处理系统音效处理系统.16 3.ui3.ui 系统系统 .17 4.4.事件系统事件系统.17 5.5.资源管理系统资源管理系统.17 (二)需要扩展的系统(二)需要扩展的系统.17 (三)(三)w windowsindows下开发游戏需要特殊对待的问题下开发游戏

5、需要特殊对待的问题 .18 使用vb.net开发游戏全面详解 第 2 页 共 25 页 六、六、2d2d 游戏中的常用算法和数据结构游戏中的常用算法和数据结构 .1818 (一)俯视(一)俯视 2d2d 游戏地图块拼接算法游戏地图块拼接算法.18 (二)俯视(二)俯视 2d2d 游戏地图的遮挡游戏地图的遮挡.18 (三)斜角度游戏地图拼接算法(三)斜角度游戏地图拼接算法.19 (四)斜角度游戏地图的遮挡(四)斜角度游戏地图的遮挡.20 (五)搜索算法(五)搜索算法.21 (六)智能算法(六)智能算法.21 (七)线性表(七)线性表.21 (八)堆栈、队列和串(八)堆栈、队列和串.22 (九)树

6、和图(九)树和图.22 七、游戏开发中的小工具七、游戏开发中的小工具.2222 (一)文件打包系统(一)文件打包系统.22 (二)地图编辑器(二)地图编辑器.23 (三)批处理工具(三)批处理工具.23 参考文献:参考文献:.2323 致谢致谢.2424 使用vb.net开发游戏全面详解 第 3 页 共 25 页 内容摘要内容摘要 vb.net 是现在开发 erp 软件中的一个很流行的编程语言,相对于 c#来说 vb.net 开发有着它自己的优点-快速。谁也不能否认 vb.net 开发的高效 率性,无论是代码编写中 visual studio 提供的关键字联想功能,还是在完成 代码后编译器的编

7、译速度都是对开发者开发效率上有很大的帮助。对于游戏开 发来说,其难度比开发其他软件有过之而无不及,使用托管下的 directx 来说 可以减少很多代码的编写,而使用 vb.net 又能进一步的提高我们开发的速度。 本文介于这两点,很全面的介绍了 2d 游戏开发中所需要的技术和将要面对 到的困难。从游戏的种类到 vb.net 中的语义,从一些常用的算法到数据结构, 甚至于游戏开发中的一些小工具的开发。虽然本文并未将这些一一的详细使用 代码来详细的讲解,但无疑对于一些想进入游戏开发界的初学者来说,本文可 以起到一个指引学习方向的作用。 本文中最重要的两个章节即为第四章节和第六章节,读者深入了解游戏

8、开 发之后可以很明确的发现第四章节和第六章节的重要性。第四章节中主要介绍 了 vb.net 的一些很重要的面向对象的语义和知识,并在最后简单的阐述了开发 游戏或其他比较大的项目时对于类的建立应该注意的问题。第六章节则提供了 游戏开发时需要使用到的一些算法,对于程序来说好的算法无疑应该放在第一 位,该章节就当前流行的几种游戏地图拼接上给出了示例和源码(在设计的文 件中)。 详细的看完该文章之后也许你的开发知识并未能就此增加多少,但可以给 你将来的学习方向上有个很好的提示,让你尽量的少走一些不必要的弯路。 关键词关键词: vb.net 2d 游戏开发 managed directx 游戏常用算法

9、数据结构 使用vb.net开发游戏全面详解 第 4 页 共 25 页 使用使用 vb.netvb.net 开发开发 2d2d 游戏的全面讲解游戏的全面讲解 序:什么是游戏序:什么是游戏 游戏对于大多数学计算机专业的同学来说并不陌生,但如果沉溺于游戏中你就会很难 了解游戏的本质,以至于游戏成为了你生活的一部分,或者是不可缺少的一部分,21 世纪 的你大脑输给了一个机器,这是很可悲的。所以我在此呼吁那些整天沉醉于游戏的同学们, 看清游戏的本质,不要将自己的青春无谓的浪费在耍玩游戏上。玩游戏嘛,适可而止!毕 竟你还是学计算机专业的。 什么是游戏呢?对于游戏的策划者来说游戏也许是个商品或是项服务;而对

10、于我们程 序来说游戏则是有许多不同但互相合作对象按照特定的组合排列出来的一个虚拟的世界模 型;而对于玩家来说游戏是种消遣、娱乐,更有甚者将其视为生活中不可缺少的一部分。 对于不同的人游戏的意义也是不相同的,就像不同的人对待一个老树根的态度一样,雕刻 家会想到将其雕刻出一个艺术品,农民则会认为它可以用来烧一壶热腾腾的开水,木匠则 会觉得它毫无用处。 对于游戏,我将我定位在程序上。虽然曾经为打怪升级熬过无数的通宵,但自从看了 云风出版的游戏之旅-我的编程感悟之后,也会觉得自己曾经的付出是那么的可 笑。云风这个人相信对于热爱游戏开发的程序员来说并不陌生,在我心目中,中国的游戏 程序员我最羡慕两个就是

11、云风和姚状宪。可惜虽然我有着和他们类似的童年经历却走不到 他们现在的地步。 对于程序,我将我定位在一个门外汉上。虽然我学了一些编程语言,但我觉得那只是 皮毛,因为我一直都是在使用别人已经封装很好的类,目前我也在试图改变这种状态,故 将会学习更多关于操作系统基层的技术。一个程序员无论何时都应该是这样的,当你学的 东西越多时就会觉得自己不懂的东西更多,而不是一直停滞在某个阶段,我就见过好多设 计 windows 或 web 程序的程序员,将几个控件拖拖放放,然后在后台写上几行代码就会觉 得自己对这项语言掌握的很好,其实不以为然。要想真正的学号一门语言,就不要一直用 别人已经做好的东西,何不尝试自己

12、动手写个?如果你一直停滞,即使你学会了很多种语 言也不见得你能掌握编程之道。 对于游戏程序员,我很羡慕他们,因为大多数的游戏程序员都是自学游戏编程的,他 们有着敏锐的观察和学习能力。以至于无论是平台的变迁还是语言的更换,他们都能以最 短的时间适应过来,他们生命力顽强的就想野草,“野火烧不尽,春风吹又生。”!c+名 人 alexandrescu 曾经说过,十几岁的编程天才到处都是,三十岁的优秀设计师凤毛麟角, 使用vb.net开发游戏全面详解 第 5 页 共 25 页 故掌握一种力量很容易,而学会恰当的使用这种力量却难很多,这就是聪明与智慧之间的 差别。 最后想要达到编程界的一个巅峰,只有不断的

13、练习。程序设计中的技巧如何获取掌握? “无他,唯手熟尔!” 一、一、2d2d 游戏的简介游戏的简介 (一)(一)2d2d 游戏的种类游戏的种类 什么是游戏种类,或者类型游戏?这个问题很难回答。虽然大多数玩家都可以如数家珍 地举出一大堆游戏类型和它们的代表作,如 rpg(角色扮演类)和最终幻想系列, fps(第一视角射击游戏)和unre-al系列。但要仔细地说明类型这个概念却是很难的 事情。 简而言之,游戏类型是一种分类法,是某种技术上的妥协。如果我们把游戏简单地看 作是对人生和世界的模拟的话,由于技术上的局限性,游戏设计者不可能把握这么广阔的 主题。他们必须将世界、社会、人生的各种错综复杂的主

14、题分门别类,在一个较小的范围 内,利用现有的可行的技术来予以表现,这样各种游戏类型就诞生了。 有的类型起源于旧有的手工或者纸牌游戏,比如说美式 rpg 起源于他们的纸上 rpg 游 戏。有的类型则是由一部开山之作确立,比如doom之于 fps。还有的类型是几个类型 的融合,比如黑与白是宠物类游戏和上帝类游戏的中和。 以下简单介绍已经成为业界和玩家共识的各种 2d 游戏类型: rpgrpg(role-playingrole-playing gamegame)游戏无疑是最受欢迎的游戏类型之一。但很难对其进行确 切定义。下面采取用其性质或者说其构成要素来定义其本身的方法,在阐述了下述问题之 后,对

15、rpg 游戏的定义问题也就得到了解决。 剥去各种 rpg 游戏的外部特性,我们可以看到 rpg 游戏的普适模型,这也是所有单线 发展的 rpg 游戏的拓扑结构。它由两部分构成:一部分是主控部分,也就是交互部分。当 主控部分起作用时,游戏的操纵权被授予了游戏者,游戏者可以充分利用游戏所赋予的交 互手段进行输入;另一部分是设定的被动的剧情,由线性排列的一连串事件组成。所谓事 件,就是在一定时间内从游戏者手中剥夺游戏的操纵权,从而使游戏按设定的轨道向下发 展,比较普遍的是被动地显示一段动画。在游戏过程中,游戏者获得操纵权后,进行输入。 一旦引发某个事件(显然单线 rpg 游戏同一时刻只可能引发一个惟

16、一的事件),游戏者操 纵权被剥夺。当事件完成后,操纵权又被赋与游戏者,用来引发下一个事件。游戏者就是 这样不停地交替地被赋予和剥夺游戏操纵权,事件也就这样按设定的轨道发展下去。所以 我们发现:rpg 游戏中游戏者只是虚假地拥有主动性,游戏者实际上只拥有决定何时引发 事件的权利(玩 rpg 游戏的能力高低就在于是否能很快找到引发事件的“点”,能力低者 会淹没于 rpg 游戏中各种信息的海洋中,不知哪个信息是决定事件发展的关键),而不具 有任何决定事件发展顺序或事件本身的权利。 使用vb.net开发游戏全面详解 第 6 页 共 25 页 actact(actionaction gamegame)原

17、来是家用游戏机上最流行的游戏类型。在任天堂 8 位机的时代, 魂斗罗双截龙等横卷轴 act 曾经风靡一时。最早的玩家们被冠以“闯关族”一名, 就是因为在横卷轴 act 游戏中,玩家要从左向右一关一关地闯过去,最终打倒大魔头。 以现在的眼光来看早期的 act 游戏,我们会发现这种游戏才是真正传统意义上的“游 戏”它侧重于手眼协调和条件反射。每一关的敌人都是从固定的地方跳出来,按固定 的轨迹运动,可以说没有任何智能可言。因此,玩家如果玩了足够多次之后,对整个游戏 可以说是成竹在胸。act 游戏的乐趣,就在于通过不断的训练达到某种技巧上的娴熟,并 培养出一定的条件反射,然后在玩游戏时达到下意识或者无

18、意识的高超水平一种行云 流水似的流畅感觉。 ftgftg 格斗游戏格斗游戏也是一个长盛不衰的游戏类型。其基本特征是在一个狭小的场景里,通 过复杂的按键序列来控制双方角色进行一对一的打斗。二维格斗游戏一般采取平视镜头。 三维格斗游戏一般使用第三视角。比之 act,ftg 的背景固定,玩家的注意力完全在对手身 上。 目前 ftg 的发展趋势是三维场景变得更大更复杂,可以使用场景里的道具,以及使用 物理编程来使得打斗真正符合现实世界的力学原理。 rtsrts(real-timereal-time strategystrategy gamegame)作为一种游戏类型也是由一两个开山大作所确立的。 19

19、92 年的沙丘 2(dune 2)和 1995 年的命令与征服(command class test public: void testsub(int a,int* b,int 可以看出传了四个值分别为:传变量数值、传变量指针、传变量引用、传函数指针。 可以看出在 c+中指针真是无所不在啊! vb.netvb.net 函数,下面我们我 vb.net 重写上面的代码段: public delegate function subtest() as int16 public class test public sub testsub(byval a as int16, byref b as int1

20、6, byref c as int16, byval d as subtest) end sub end class 可以看出我们用 byref 替代了变量指针,使用 delegate(托管)替代了函数指针,这样使 得代码更安全,也不失对指针快捷操作的保留。 在 c+c+中中也有我所说的虚无的虚无,并且概念很强烈,在 c+对子类中函数的调用并不是判断 是否重写,而是根据传值的类型来判断。如果传的不是该类基类的指针则判断该类中是否 有该方法,有则调用,否则查基类;若传的是该类基类的指针则判断基类中该函数是否为 虚函数,不是虚函数则调用基类的该方法否则调用该类的方法。在 c+中虚函数配合类创 建时

21、隐含的指像该类对象的 this 指针在类申明的时候使用可以完成很多事情。关于这个隐 含的指针类似于 vb.net 中的 me,都是指对象而非类的本身。 最后关于类的建立我提出一点自己的看法,不要盲目的去建立很多的类,这样会使得 代码很难管理,我们应该先规划好每个类与类之间的关系,通过派生产生新的子类,通过 上面说的虚无手段实现新的方法,尽量的做到每个基类与基类都是“高内聚,低耦合高内聚,低耦合”的。 好的类的构建可以让程序员的逻辑思维一直很清晰,反之则反之。 五、封装五、封装 managedmanaged directxdirectx 构建自己的构建自己的 2d2d 引擎引擎 这个章节主要是对

22、毕业设计中的程序进行讨论的,看该章节是请参照我的毕业设计中 使用vb.net开发游戏全面详解 第 17 页 共 25 页 一些程序的源文件。 (一)引擎必备系统(一)引擎必备系统 1.1.绘制图片系统绘制图片系统 既然是封装 mdx,绘制图片自然就不能像 mdx 中那么的麻烦,要尽可能的最简化但能 满足用户的基本需求。在我的 prinsun2dengine 中对于绘制图片部分的代码在 psengine 类中实现,具体代码参见那里,也许代码很简陋,不过就算是抛砖引玉了吧。 2.2.音效处理系统音效处理系统 音效的处理是引擎中比不可少的部分,这里不仅要实现从文件中播放音效的功能,还 应该实现从引擎

23、的打包工具中播放音效的功能,且需要实现对音效播放的基本控制。代码 参见 prinsun2dengine 中的 psmusic、pssound、pssoundsmanager。 3.ui3.ui 系统系统 ui(user interface 用户接口)无疑是游戏与用户交互的主要方式,故引擎中这个部 分也是必不可少的,但这个部分很复杂,一般的引擎中都没有实现,它们将这部分留给了 用户自己来实现。我也曾经疯狂的使用多线程来实现,可想而知在并行处理器上效率是可 想而知的。在我的 prinsun2dengine 中也没有实现这个系统,主要是因为时间的问题,在 下个版本中是肯定不会放过这个系统的。不过在我

24、的那个“不完善的示例”中有个类叫做 “gameuiunit”,基本上完成了用户对 ui 的需求,代码参见那里即可。 4.4.事件系统事件系统 事件是游戏的灵魂,如果一个游戏没有了事件,那玩家只能漫无目的的乱窜,这会使 得所有玩家都疯掉,所以一个好的引擎中应该就事件系统给予模型。一般的处理事件都是 靠脚本,所以引擎中内带一个专门的脚本解释器是再合理不过的了。事件是游戏的逻辑, 在windows 游戏开发大师这本书中明确的指出,将游戏的逻辑放在外部文件中是避免 硬编码的最有效方法。可想而知脚本的重要性,可惜的是我没有更多的时间来构建自己的 脚本语言,所以我的 prinsun2dengine 中脚本

25、这块还是空缺着,等下个版本吧。这里点一 下,在构建脚本中必须满足脚本语言的基本语义: 1)分析并执行字符串脚本和文件脚本. 2)从程序内部获取和设置脚本变量 3)从程序内部调用脚本函数,包括参数传递和返回值处理. 4)让脚本获取和设置程序变量 5)让脚本调用程序函数,包括参数传递和返回值处理. 6)类体系的体现和交互,包括 2-5 的内容 使用vb.net开发游戏全面详解 第 18 页 共 25 页 这里想要构建一个好的脚本系统堆栈是必不可少的数据结构,在 c 语言中对于函数的 调用,解释器就是使用堆栈实现的。 5.5.资源管理系统资源管理系统 游戏中的资源管理一直都是优化的头等大事,好的资源

26、管理可以节约很多的内存,且 方便程序需要时随时调用,大部分的引擎这一块都是使用树来实现,我的 prinsun2dengine 中对于资源管理没有用到这么复杂的数据结构,只是将链表进行了一点小小的改动,用数 组记录链表地址的索引,链表用来添加删除数据。参考代码: psresourceset、psgamepicmanager、psfileset。 (二)需要扩展的系统(二)需要扩展的系统 如果你的引擎完成了上面所有的系统,那么就要注意对引擎的其他系统加以扩展了, 构建出一个更强大的并有自己特色引擎,需要扩展的系统很多,如:物理动力系统、光照 系统、网络数据传输系统(用于创建多人游戏)、粒子系统等等

27、。总之等待你自己去想象, 你的工作是不会停止的。 (三)(三)windowswindows 下开发游戏需要特殊对待的问题下开发游戏需要特殊对待的问题 我在这里谈及的全部都是在 windows 下开发游戏的知识和理论,虽然 windows 平台上 开发游戏是立竿见影(不需要任何的模拟器),但也有它需要特殊对待的问题。 首先就是页面丢失的问题,在全屏模式下当用户按下了 win 键之后,所有的绘制页面 都丢失了,这个时候我们所有的绘制都应该停止、计算也应该停止、声效也应该停止。 其次就是 alt+f4 问题,好的游戏在处理这个问题的时候都会将用户的数据保存或备份, 在下次进入游戏的时候提问是否恢复。

28、 还用很多需要考虑的,比如游戏中用户改变了当前显示器的分辨略,用户运行了两个 该游戏等等。开发者应该尽可能去处理这些特殊事件,而不是靠一个手册来约束用户的行 为规范。 六、六、2d2d 游戏中的常用算法和数据结构游戏中的常用算法和数据结构 (一)俯视(一)俯视 2d2d 游戏地图块拼接算法游戏地图块拼接算法 俯视 2d 游戏的地图拼接很简单,因为我们可以将它简单的看成一个 2-d 坐标系统,用 一个二维数组即可记录下它的所有信息,其中二维数组中第一维的标识记录贴图的 x 坐标, 第二维的标识记录 y 坐标,即 map(12,11)表示的就是地图上坐标为(12,11)的贴图。绘 制的时候我们只需

29、要使用一个嵌套 for 循环将这些贴图从上到下,从左到有的绘制出来即 使用vb.net开发游戏全面详解 第 19 页 共 25 页 可。而对于数据的定义开发者可以自己根据实际情况来设定,大部分的定义中都会记录一 些阻挡和层的信息。(代码参见 “指南 07_2d 俯视地图拼接”) (二)俯视(二)俯视 2d2d 游戏地图的遮挡游戏地图的遮挡 俯视地图中的遮挡无疑也是个非常简单的问题,我们可以直接通过 y 坐标的大小来判 断,y 小的会被 y 大的遮挡住,这其中还要考虑到你定义的层的信息,在层相同的情况下 上面的说法是成立的,如果层不同则需要判断层的权值,谁的权值大,谁就不会被遮挡。 对于那些不只

30、占用一个空格的贴图,我们只需要在贴图坐标上定义一个基坐标即可,也就 是预处理。图 6-1 是 2d 俯视贴图的一个坐标展示: 图 6-1 (0,0)(1,0)(2,0)(3,0) (0,1)(1,1)(2,1)(3,1) (0,2)(1,2)(2,2)(3,2) (三)斜角度游戏地图拼接算法(三)斜角度游戏地图拼接算法 在斜视角游戏中表示地表的 tile 是菱形的,但计算机中处理的图片都是矩形的,也就 是说只能使用矩形的图片来存放菱形的 tile。这样就出现了一个问题,如何对存放 tile 图片进行拼接,才能出现象大多数斜角度游戏地图那样的效果。图片拼接时出现重叠部分 是不可避免的,但是可以想

31、办法隐藏每个 tile 图片的多余部分。一种方法是在制作每个 tile 图片是将多余的部分使用黑色 (颜色值为 0) 填充,在将 tile 绘制到屏幕上前将整 个地图区域也使用黑色填充,然后使用异或方式将每幅 tile 图片绘制到屏幕上,也就是绘 制前先让 tile 图片中的每个像素和屏幕上对应像素进行异或运算。由于任何值和 0 进行异 或运算的结果是保持值不便。所以使用这种方式绘制 tile 可以保证 tile 图片中多余的部 分不影响最终的图像。还有一种方法就是将 tile 图片作为带有透明颜色的位图处理,使用 镂空位图绘制函数或 rle 位图绘制函数进行绘制,这样就可以去除 tile 图

32、片中多余部分。 在演示程序中使用了后一中方法。 关于拼接,目前有两种坐标的定义,一种是从左到右(如图 6-2),另一种则是从中 间向两边扩散(如图 6-3)。这两种各有各的优势,示例程序使用的是第一种方式,因为 这样能更好的体现出世界的完整性,如果使用第二种的话多出来的未定义坐标的贴图很多。 (代码参见 “指南 08_2d 斜角度地图拼接”) 使用vb.net开发游戏全面详解 第 20 页 共 25 页 图 6-2:斜角度拼接图 1 图 6-3: 斜角度拼接图 2 (四)斜角度游戏地图的遮挡(四)斜角度游戏地图的遮挡 斜视角为 2d 游戏带来了立体感,增加了游戏的视觉效果,但同时也为游戏的制作

33、带来 了新的困难。其中一个就是如何解决物体和精灵之间的遮挡问题。众所周知,在真实的世 界中对于人的眼睛来说,前面的物体会完全或部分地振荡住后面的物体。但是在 2d 游戏中, 所有的物体和精灵都是使用图片来表示的,而不象 3d 世界中是一个个的实体,所以在 2d 游戏中,尤其是在斜视角游戏中,解决物体和精灵的遮挡问题是游戏制作中的一个难点。 即使在许多成功的商业游戏中,在这一点上也没有做到十全十美。 既然在 2d 游戏中所有的物体和精灵都是以图片来表示的,那么物体和精灵间的遮挡问 题必然涉及到图片的绘制顺序问题。所以解决遮挡问题的核心也就是确定图片的绘制顺序。 首先可以将精灵分为两类,一类是在地

34、面上移动的,另外一类是在空中飞行的。在空中的 精灵,由于它们比地面的物体都高,而且就算它们重叠在一起,也不会给人不真实的感觉, 所以对于它们可以不进行特别的遮挡处理,只需要在绘制完其它的物体和精灵之后再绘制 它们就可以了。对于在地面上的精灵,由于每一时刻它们只能在地图的某个位置上,所以 在遮挡问题上可以将它们作为物体来看待。因此,我们最终的问题归结到如何解决物体间 的相互遮挡上来。 通过仔细观察斜视角地图的结构不难发现这样的规律,对于只占用了一个地图坐标的 物体来说,使用画家算法对进行绘制就可以保证它们之间正确的遮挡关系。所谓画家算法 就是指先画远的物体再画近的物体,这样近的物体必然会遮住远的

35、物体。在斜视角游戏中 dim map(n-1)(n-1) as s_mapitem n 行 n 列的地图数组 for i as integer = 0 to n-1 for j as integer =0 to n-1 绘制 map(i)(j) 处的物体 next j next i 使用vb.net开发游戏全面详解 第 21 页 共 25 页 可以这样确定物体的远近:物体在地图上的 y 坐标越大,物体就越近,如果 y 坐标值一样, 那么 x 坐标越大,物体就越近。按通常的习惯,在二维的地图数组中使用行表示 y 坐标, 使用列表示 x 坐标,所以对于只占用一个坐标的物体来说,可以按这样的顺序进行

36、绘制: 先以列值从小到大的顺序绘制第一行中的物体,然后以同样的顺序绘制第二行和以后各行。 正如下面的程序段中的一样: 对于占用了不止一个地图坐标来说,我们还是和 2d 俯视贴图一样,我们只需要在贴图 坐标上定义一个基坐标即可,也就是预处理。 (五)搜索算法(五)搜索算法 关于搜索算法,现在网络上也有很多,这里我不想写出它的原理,只是提供算法类型名 称,若你完全没有听说过,那你就必须去学习该算法了。 1)广度优先搜索 2)深度优先搜索 3)迭代加深搜索 4)启发式搜索(最常见的 a*,a,ida*) 5)博弈树搜索(常见的 sss*,memss*) 最后提醒下,搜索算法不是只让你用在寻路问题上,

37、在一些需要枚举求解的情况下也 是需要使用搜索算法的,比如 rpg 中回合战斗时,电脑就需要搜索那种招式对现在的玩家 伤害最大。 (六)智能算法(六)智能算法 下面提到的算法都是一些很少见的算法,但也许会成为将来人工智能的主体方向也不 一定,有兴趣的可以都互联网上搜索。 1)遗传算法(genetic algorithm) 2)模拟退火算法(simulated annealing) 3)禁忌搜索 (tabu search) 4)人工神经网络 (artificial neural network) 好的算法可以解决很多问题,其实程序是什么呢?归根结底就是算法加上数据结构, 下一章里我们来说说数据结构

38、。 (七)线性表(七)线性表 在数据结构中,我们通常面对的是数据的逻辑关系而非物理地址的联系。例如线性表, 指的是有限的逻辑上的有序序列。这里的有序是指每个元素都有自己的位置,并且有确定 的前驱和后继(可以为空)。通常,每个数据都是类型相同的。 然而,根据计算机实现的不同,我们可以把线性表分成两类:数组和链表。 数组是指物理地址连续的表,可以用内存地址来检索对应的元素。这样,我们可以用 使用vb.net开发游戏全面详解 第 22 页 共 25 页 常数时间访问到指定位置的元素,但是在中间插入和删除元素时间复杂度却为线性的。 而链表每个元素的物理位置是任意的,通过指针串起来。它的访问时间非常长,

39、但插 入和删除速度却很快。而且由于需要额外的空间记录元素的前后关系,所以占的内存也略 大于数组。 在 vb.net 中数组很容易根据自己的情况来申请,对于数组的处理很重要的一个使用就 重分配,这里的重分配其实是有.net 创建了一个新的数组将原有的数组需要保留的部分复 制了过来,通过检测数组的地址可以知道前后数组的内存地址不同,重分配使用 preserve 保留原来数组中的数据。关于链表在 vb.net 中有个 arraylist 可以使用,也可以将其视为 泛型使用。开发者应该权与速度和内存选择其中的一种使用。 (八)堆栈、队列和串(八)堆栈、队列和串 堆栈和队列是两个非常特殊的线性表。 堆栈

40、这个概念在现在的程序设计中必不可少,准确的说,在计算机术语中,堆和栈是 两个不大相同的概念。这里说到的堆栈是指栈(stack)。这种数据结构,即限制一个线性 表的操作,只能从一头进出,先进入的数据后出来。它广泛的被用于类 c 的语言中的函数 调用机制。我们在做脚本语言是也是需要使用到它。 队列和堆栈相反,它采取的是先进的先出策略。一般我们实现的时候让数据从线性表 的一头进入,从另一头出去。这个数据结构用来保持元素的先后顺序,被广泛用在消息通 讯中,也可以用于广度搜索算法。 由于效率因素,这两种数据结构大多数使用数组来实现。 串(string)是一个符号的序列。这些符号一般是一些字符,所以,通常也被称为字 符串。字符串通常使用字符数组来实现,这是一种最经济实惠的实现方法。 串本质上也是一种线性表,但和堆栈和队列不同,串的操作大多数不是以里面一个元 素为单位,而重点在与串的全部或者一部分的比较、连接、匹配等。这些操作的实现算法 也相对复杂的多。 (九)树和图(九)树和图 树:树: 简单地描述,树就是有层次的数据集的一种组织方式。树中的每个数据节点都有或没 有它所下属的数据集。而除了根节点是整个树的根源外,每个数据节点都有唯一的父亲节 点。 软件的图形界面,通常

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论