方块原理在Flash游戏设计中的应用

时间:2022-09-01 05:52:32

方块原理在Flash游戏设计中的应用

摘要:在Flash游戏设计中合理地运用方块原理,通过分割地图、创建影片剪辑元件及定义地图数组,平台类游戏的关图创建起来非常容易。

关键词:Flash;游戏;方块;数组;地图

中图分类号:TP311文献标识码:A 文章编号:1009-3044(2007)05-11347-02

随着Flash版本的不断更新, Flash ActionScript功能日益强大,越来越多的编程人员想利用Flash开发出引人入胜的交互式游戏。实际上,大家熟悉的暴力摩托、超级玛利奥和穿越峡谷等游戏利用现在的Flash ActionScript开发非常容易,这些平台类的关图游戏开发之所以比较容易,是因为引入了方块原理。借助于方块原理在Flash中很容易构建地图、进行窗口转换以及地图滚动。

1 方块原理

1.1 方块原理涵义

将Flash的舞台分为若干个大小相同的方块,使用二维数组一一对应每个方块,使用Flash ActionScript的相关语句动态地调用库中的影片剪辑元件进行创建地图、实现房间转换以及地图滚动,库中的被调用的影片剪辑元件特定帧的形状大小与舞台上分割出来的方块大小相同,如果舞台上两个方块的内容相同,调用的则是库中的同一个影片剪辑元件,这就是我们所说的方块原理。Flash平台类游戏的关图,可以分为单一界面、房间转换以及地图滚动三种,他们用到的基本原理都是方块原理。

1.2 方块的特性

我们想在游戏中加入漂亮的背景,但是图片太大了,使得游戏变得很慢,怎么办?把图片分割成方块。如图1.1所示,这是一个500pixel×400pixel舞台上的场景地图,我们可以把舞台上的场景地图平均分割成16行20列,每个方块大小为25pixel×25pixel,如图1.2所示。在图1.2中,我们可以看到地图的某些部分是完全一样的。比如:第3行第14列的方块内容和第7行第6列的完全一样,是M7平时转动主角撞击时消失的金币;第7行第12列的方块内容和第11行第6、11、13列的内容完全一样,是M8平时闪烁主角可以撞击出金币的问号;第9行第20列的方块内容和第11行第10、12、14列的内容完全一样,是M9平时不动主角撞击时会动的砖块;第15行和第16行的所有方块内容一样,是M17路面砖。对于这些内容相同的地图,我们可以重复使用相同方块来构建,此地图只需用17种小方块即可创建,这样文件大小比大图片就小多了,游戏运行会更加流畅。

在游戏进行中,当主角发生了某个特定的动作时,场景中部分地图要发生变化,如果用的是大图片,则需重新导入整个大图片,这会使游戏停顿、变慢,怎么办?使用方块构建地图,只需把场景要替换的部分用其他方块替换即可,简单易行。比如,问号被主角撞击后需变成没有问号的普通砖块,只需把原来地方的一个方块内容替换即可。

在Flash平台类的关图游戏中,虽然不同关的关图不同,但是将他们分割成方块后,我们会发现构建他们的方块许多是一样的,只是同一方块的数量、排列位置或方式不一样。这样我们就可以把方块内容建成影片剪辑元件放在库中,不管到了哪一关,都可以重复调用此影片剪辑元件来按照自己的意图构建新的关图,而且使游戏文件的大小减小许多,运行也更加流畅。

2 影片剪辑元件的创建

为了便于动态地创建地图,需要先将地图上不同的方块各自创建成影片剪辑元件存放在库中,然后再创建一个影片剪辑元件,并指定标识符,从第一关键帧开始在每一关键帧上从库中拖出一个方块的影片剪辑元件放在舞台上,一个关键帧对应一个方块的影片剪辑元件。

2.1 创建方块内容对应的影片剪辑元件

对于图1.1,我们可以按照图1.2所示进行分割,从M1到M17一共有17个方块内容需创建成影片剪辑元件,也就是要创建17个影片剪辑元件。为了便于以后调用、识别,需要按照地图中的方块名称为各自对应的影片剪辑元件命名,比如影片剪辑元件的内容为M1方块内容的我们将此影片剪辑元件命名为M1,这样创建的17个影片剪辑元件的名称为M1、M2、M3……M17。如果地图中方块的内容是不变的,如M1、M2、M3、M4、M5、M6、M10、M11、M12、M13、M14、M15、M16、M17,其对应的影片剪辑元件只需一个关键帧,方块内容置于关键帧里;如果地图中方块的内容平时是不变的,但是当主角对其发生动作时内容发生变化,如M9,其对应的元件第一关键帧里不仅放置地图上显示的方块内容,还要加上脚本语言stop(),后面再设置其他关键帧;如果地图中方块的内容平时是变化的,且当主角对其发生动作时方块内容还要发生新的变化,如M8,其对应的元件前面几个关键帧放置正常变化时的方块内容,在循环点设置一个关键帧,添加脚本语言gotoAndPlay(1),后面再设置其他关键帧;如果地图中方块的内容平时是变化的,但是不受主角动作的影响或主角对其发生动作时方块内容消失,如M7,其对应的元件只需设置几个关键帧放置变化时的方块内容,在最后一个关键帧,添加脚本语言gotoAndPlay(1)。

2.2 创建地图直接链接调用的影片剪辑元件

所有方块内容对应的影片剪辑元件M1到M17创建好之后,再创建一个非常重要的影片剪辑元件,也就是Flash ActionScript创建地图时直接调用的影片剪辑元件,为了确保游戏运行平稳流畅,创建此元件时必须为其指定“为ActionScript导出”和“在第一帧导出”,并指定链接标识符。对于图2所示的地图,为其创建供直接调用的影片剪辑元件时,在新建元件对话框中,名称指定为“方块序列”,类型选择“影片剪辑”,将“为ActionScript导出”和“在第一帧导出”选中,并指定链接标识符为“xiaokuai”。接下来每选定一个关键帧,就从库中将一个方块的影片剪辑元件拖至舞台创建实例,为了让方块内容在创建地图时出现在地图上指定位置,应该使实例的左上角与舞台的中心重合。因为有17个小方块影片剪辑元件,所以在“方块序列”影片剪辑元件中要创建17个关键帧,为了便于在Flash中定义地图的二维数组,应将关键帧的序号与方块影片剪辑元件的序号一一对应,即第1关键帧放置M1影片剪辑元件的实例、第2关键帧放置M2影片剪辑元件的实例,以此类推,第17关键帧放置M17影片剪辑元件的实例。为了在创建地图时为游戏中的“敌人”留下位置,便于以后定义Flash中包含“敌人”的二维数组,应该在“方块序列”影片剪辑元件的第18帧创建一个空白关键帧。

3 创建地图

3.1 二维数组的定义

Flash提供给我们一个很好的表示地图的格式:数组。数组第一个元素的长度值是数组的列数,也是地图的列数;数组的长度值是数组的行数,也是地图的行数。对于图1.2所示的16行20列的地图,如果用名字为ditu的数组来表示,那么ditu[0].length的值应该是20,即数组的列数为20列,ditu.length的值应该是16,即数组的行数为16行。如果游戏是单一界面,在定义地图数组时,只需一个数组,且数组的行数列数与场景中地图的行数列数相同;如果游戏的地图是左右滚动的,即地图除了场景中有,场景的左边或右边也有,所以在定义数组时,数组的行数与场景中地图的行数相同,但是数组的列数应该比场景中地图的列数要多;如果游戏的地图是上下滚动的,即地图除了场景中有,场景的上边或下边也有,所以在定义数组时,数组的列数与场景中地图的列数相同,但是数组的行数应该比场景中地图的行数要多;如果游戏有几关且关图不同,在定义数组时,应该为每一关定义一个地图数组。

图2所示的场景地图中除了我们标出的M1到M17这17种方块内容外,其余的都是由同一种颜色方块构成,为了使游戏运行流畅,对于这种面积较大、色彩单一、形状简单的部分,我们可以将其看成是背景颜色,地图是由M1到M17这17种方块在此背景上进行构建。因此我们在主场景时间轴上建立两个图层,下面一个图层第一关键帧内容是与场景大小相同、颜色为地图背景色的矩形,上面一层第一关键帧放置动作脚本。因为在创建“方块序列”影片剪辑元件时,我们已让关键帧的序号与地图中方块的序号一一对应,所以在定义二维数组时,可以让每个数组元素的值是关键帧的序号,也是方块的序号,如果方块的地方只有背景颜色,让与之对应的数组元素值为0。如果游戏场景地图是单一界面,脚本中为图2所示地图定义数组的语句应该为:

3.2 显示地图

因为在创建地图数组时,指定列指定行的数组元素的值就是“方块序列”影片剪辑元件的关键帧的序号,与地图中方块的序号也是一一对应,所以在场景中动态创建显示地图时,只要遍历数组,根据指定列指定行的数组元素的值找到“方块序列”影片剪辑元件中序号与之对应的关键帧,让此关键帧内容在地图上对应列对应行的方块位置显示。

创建地图时,为了便于对舞台上所有方块进行统一管理(比如游戏进行时所有方块一起滚动,游戏结束时删除所有方块等),应在主场景中先创建一个空影片剪辑作为“容器”,用于收容舞台上所有方块,对所有方块管理时只要对这个“容器”进行操作。如果不用“容器”,直接把方块都复制到主场景(_root)中,那么当游戏进入下一场景的时候(比如游戏结束),这些复制的方块不会消失,你只能使用更多的ActionScript来删除他们。

对于图2所示的地图,创建地图的思路是:建好地图数组后(上面已建立),创建一个名为map的空影片剪辑作为“容器”;遍历地图数组ditu,为每个小格子创建相应的方块对象,复制“方块序列”影片剪辑元件(链接标识符为xiaokuai) ,指定层次(shendu)并通过坐标为其在地图上定位,同时附加到容器map上;如果小格子对应的数组元素值为0,表示复制的方块序列元件不需在此小格子出现,将其删除;让复制的“方块序列”影片剪辑元件显示在相应的关键帧。脚本如下:

var shendu = 0;

_root.createEmptyMovieClip("map", shendu++);

for (i=0; i

{for (j = 0; j

{kuai=_root.map.attachMovie("xiaokuai" , "xiao"+i+"kuai"+j, shendu++,{_x : i*25, _y : j*25});

if (!ditu[j][i]) {

uai.removeMovieClip();

} else {

kuai.gotoAndStop (ditu[j][i]);}}}

4 结束语

在Flash游戏设计中如果能合理地运用方块原理创建地图,对于后续的地图滚动、主角移动控制、平台设置以及拾取物体等设计都是比较有利的,所以我们在设计一个Flash平台类的关图游戏时,一定要考虑到方块原理在创建地图时如何运用,比如地图的分割、方块的内容变化以及对应影片剪辑元件的创建等。

参考文献:

[1]段翔旺.Flash MX 2004互动游戏设计教程[M].北京:清华大学出版社,2005.

本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。

上一篇:广义旅行商问题与旅行商问题的转化 下一篇:用C++实现文件夹同步