TILE BASED GAMES (基于区块的游戏)
点击次数:27 次 发布日期:2008-11-21 23:34:12 作者:源代码网
|
这里你可以看到一些关于用Macromedia Flash制作tile based games(基于区块的游戏)的教程。 这些教程主要基于Klas Kroom公开发布的教程。尽情地阅读吧,这些可以算是最好的教程了。 学习这些教程之前要求你对Flash和actionscript有所了解。如果你以前从来没有制作过Flash游戏,那么理解起来可能有些困难。并且我的英语不太好,可能会有许多错误,一些地方可能表达不是很清楚。很抱歉,我尽力而为。如果你发现有什么bug或是错误,请通知我。 我用Flash5编写代码和源文件,主要是因为我习惯使用Flash5,使用起来快一点。代码和源文件在Flash MX下运行良好,如果你使用Flash MX的话将不会有问题。使用AS2的Flash MX 2004与过去的AS不兼容,所以这些代码可能会出错,也可能正常运行。但是,如果你真的想使用AS2,最好还是自己重新写这些代码。当然,你仍然可以运用这些原则,所以这篇教程还是值得一看的。 这里的范例代码和源文件都可以自由使用,你可以按照你的愿望修改它们,可以在任何地方放心使用。 希望有人能从中找到一些有用的东西。:) 为什么要用区块 在编写这个游戏的代码之前,我们来谈谈基于区块的游戏(tile based game)的基本知识。你为什么想要使用区块?基于区块的游戏做起来容易一些还是它们比基于美工的游戏(art based games)复杂一些?Flash擅长制作基于区块的游戏吗? 区块在很久以前就用来制作游戏了。那时,计算机没有数GHz的速度和数百MB的内存。缓慢的速度和有限的内存意味着游戏制作者必须充分利用他们的大脑,选择高明的途径来使游戏跑得快一点,看上去效果好一点。 这样说吧,你想要在游戏中使用漂亮的背景,但是背景图片太大,以至于严重影响游戏的速度。怎么办呢?那就把图片切分成区块!
从这张图片你可以看到图片的有些区块几乎是一模一样的。1和2相同,3和4相同,5、6、7都相同。如果你将图片切割,在不同的位置重用相同的切割下来的碎片,你就已经创建了区块。完整大图片的文件大小比区块大得多。 区块的其他一些良好特性是,当你想要替换部分背景时,你不需要重绘每样东西,你可以只替换1个区块。你也可以和其他的对象一起重用区块。例如,你可以使用代表草坪的区块和代表草坪上盛开的鲜花的区块。因此你可以保持草坪区块不变,而只需要绘制鲜花。 Flash和区块 众所周知,Flash是基于矢量图的,因此Flash文件比较小,你还可以调整它们的大小。因此,你在做游戏的时候就不需要使用区块了?但是当你的游戏区域增大,并且你想要更多的效果,你就会遇到问题。在基于区块的游戏中,许多东西都变得简单得多了(等轴视图、寻径和为了最少的命名而执行的深度排序)。不要忘了,基于区块的游戏已经出现了很久,很多理论在Flash中同样适用。 Flash的基于区块游戏也有不利因素,那就是我们不能从Flash的绘画或时间轴中得到多少好处,我们的游戏使用actionscript构建,我们只需要编写大量的代码,用代码在舞台中移动和修改图片。 使用位图作为区块图片也是一个好办法。虽然我们可以在Flash中绘制矢量图,但是在游戏运行的时候,播放器需要计算矢量图如何在屏幕上显示。我们不想因为任何原因拖慢我们的游戏。位图是预先渲染的,并且看起来也更舒服。如果你要将位图区块导入到Flash中,最好是把位图存为具有透明背景的GIF格式。 闲话到此为止,下面进入正题,开始做点东西 :) 首先,我们将看看如何存储基于区块的地图。 地图格式 我们将把地图以数组(array)的形式保存在Flash中。如果你不知道什么是数组,请先查看Flash的帮助文件。 二维数组 我们需要二维数组来存储地图。它不是其他维以外的什么东西,它只是每个元素都是数组的数组。糊涂了吗?往下看。 一般情况下,一般的人都会创建一个简单的数组:
这非常简单。你可以使用myArray[0]获取第1个元素的值,你将得到"a",第2个元素myArray[1]包含值"b",以此类推。 现在来看点精彩的!如果我们不将"a"、"b"和"c"存进数组,而是将另外的数组存进数组呢?是的,我们可以这样做。下面,我们来创建几个数组:
这样myVar就获得值["c1", "c2", "c3"]。 你可能会问,那又怎样呢?我们不会就此停下。如果你写:myVar=myArray[2][0];那么myVar将得到数组myArray的第3个元素中的第1个元素的值"c1"。 我们来更进一步的练习。myVar=myArray[0][1]取得数组myArray的第1个元素myArray(a)中的第2个元素的值,即 ("a2")。 myVar=myArray[1][0]取得值"b1" 你明白了吗? 创建地图 首先我们写一个地图数组,它将存储每个区块的信息:
正如你看到的,我们的地图有6行8列。如果游戏角色从左上角开始,那么在他走出地图边界到达下一个未知的地方之前,他可以向右走8步,向下走6步。 但是还是有一些细心的人会提出这个重要的问题:“在地图数组中的数字意味着什么?”我们将要使用一些OOP(面向对象编程,别担心,这没有它听起来那么可怕)来创建区块和管理整个游戏。我们首先声明若干区块,它们是我们要实际放到游戏中的区块的模板。然后遍历地图数组,检索每个位置处的数字。 例如,如果取得数字1,那么我们根据模板Tile1创建一个区块。在游戏中,当我们达到这个区块时,我们将检查这个区块对象的属性。它可以有多种属性,大部分区块只有两种属性,walkable和frame。 属性walkable表示角色可以走进这个区块(walkable=true)或者不可以(walkable=false)。我们并不使用hitTest,因为hitTest的速度较慢,不适合用在基于区块的游戏中。 属性frame告诉我们,在那个位置应该显示区块影片剪辑的哪一帧。它用在将区块放到屏幕上的时候。由于我们通过循环附加的方式添加每一个区块影片剪辑,默认情况下,它们都将显示第1帧。 因此,如果我们声明如下区块:
于是,每当地图数组中为1的地方就使用相同的区块对象(Tile1),并且这个区块不能被停靠(walkable=false),在那个位置上的区块影片剪辑应当显示第2帧。 更多地图格式 你可能想要知道,我为什么会选择这种地图格式。我敢说这绝对是最好的选择。我不能说用这种地图格式创建地图的速度最快,文件最小;我只能说凭着两年的基于区块游戏的制作经历,我认识到这种格式最适合我的需要。然而我们还是来看一下保存地图数据的其他途径。 以前公开的教程使用非常简单的地图格式。同样是使用二维数组,每个数字给出了在那一点上应该显示的帧编号。每次你都得检查下一个区块是不是墙(或者要拾取的东西,或者门或者其任何东西),你需要检查地图数组中存储的数字。 在检测碰撞的时候,你决定哪一段帧作为墙(或捡东西,或是门)。例如,你可以决定从第1到第100帧的区块是可通行的,从第101到第200帧的区块是墙,大于200帧的区块是特殊区块。 当你使用的区块的种类比较少,并且区块的改变不频繁,这是一个简单易行的办法。 沙漠中的树 有些地图有许多不同的区块,有些只有少量的。例如,假设在沙漠中,那里除了沙子还是沙子,如果运气好的话,偶尔可以看到些绿洲。或者假设在海上,那里除了水就是水,最后可能有个小岛。 如果你的地图主要由相同的区块(沙)构成,只有少量的变化(树),那么二维数组并不是一个好选择。它将保留过多的无用信息,除了极个别的特殊数字外,就是一行接一行的0。在这种情况下,你最好单独声明除沙以外的所有对象,没有声明的就意味着都是沙了。 我们来假设你有一个100x100的地图,其中有3棵树,你可以这样写:
当创建这个地图的时候,你遍历trees数组,布置树的位置,其他区块一律显示沙子的图片。这比编写一个100x100的二维数组要容易多了。 当然,当你创建多一点对象(树、灌木、草、石头、水)时,这种方法将失去它的速度优势,并且要记住哪个区块放在哪里也会变得困难。 S, M, XXXL 如果你有Flash MX或其后的版本,你多半听说过神奇的XML。它与HTML的格式类似,允许声明许多东西。你可以使用XML来保存地图数据。 下面的XML地图基于Jobe Makar的《Macromedia Flash MX Game Design Demystified》一书。 让我们看一下这个用XML表示的示例地图:
源代码网供稿. |

