Flash专栏: 基础教程 | 技巧运用 | MTV实例教程 | 游戏实例教程 | 实例教程 | AS教程(new)
photoshop专栏: 基础 | 进阶 | 技巧总汇 | 精彩实例 | 文字特效 | 滤镜魔术 | 实际应用
网页设计: Dreamweaver教程 | FireWorks教程 | CorelDraw设计 | Freehand/Illustrator教程 | 音乐转换教程
其他教程: 操作系统 | 程序设计 | 网站开发 | 图形图像 | 数据库 | 网络技术 | 安全相关 | 认证考试 | 硬件知识 | 服务器
Flash专栏>flash游戏实例教程>Flash游戏制作--迷宮   返回上一页

  日期:2004-02-04 21 作者:flashsj 来源:pconline
天气预报 IP地址 手机号码 邮编 翻译 在线代理 在线评书 好dj


Flash游戏制作--迷宮



  迷宫是一种很古老的智力游戏,记得小时候玩的迷宫游戏大都是印在报纸上的,然后拿跟笔在报纸上划来划去的找出口,一旦出口被找到了,那么这个游戏的生命也就结束了,谁也不愿意重复玩一张迷宫地图,不过我们下面将要开始的Flash迷宫游戏就不同了,每此玩之前都会动态的创建迷宫,保证可以玩到不同的迷宫。

  此游戏的主界面如图1所示:

图1

  游戏玩法:

  从图1显示的游戏主界面中可以看到,此款游戏在外观上和传统的迷宫游戏非常相似,而且在玩法上也是一模一样,游戏中玩家用键盘方向键控制左上角的绿色主角,在迷宫中寻找到达右下角红色出口的通路,只要成功的到达出口,游戏胜利,可以开始玩下一局,每局和每局的迷宫地图都不相同,地图由游戏动态生成。

  游戏制作思路:

  如果想顺利的实现此游戏,首先需要考虑下面几点:

  1.主角的控制:能够很好的对主角进行控制,是增强游戏可玩性的关键,所以考虑使用键盘方向键来控制主角的上下左右的移动,使用Flash Action动作脚本提供的OnClipevent事件,可以轻易的使用键盘对游戏中的对象进行控制。

  2.迷宫的生成:这个问题是实现此游戏最关键的部分,在本例我们使用功能强大的Action动作脚本中的Array数组对象来控制迷宫的动态生成,可以保证每次游戏的地图完全不同,不过除了使用AS生成地图外,也可以使用比较传统的办法,那就是事先绘制好一些迷宫地图,分配到不同的关键桢中,然后通过Random随机函数随机跳到某一桢,这样也达到了随机显示地图的目的。不过这样做工作量比较大,而且缺乏一定的动态性,既然Flash为我们提供了强大的AS,为什么不加以利用,提高工作效率呢,所以本例我们使用AS控制`地图的随机生成。

  3.在迷宫中判断碰壁和到达终点:如果主角在运动中碰到了迷宫的墙壁,则不能继续前进,需要改变运动方向,所以在游戏中很好的对是否碰壁进行判断也是很重要的一方面。不过这个问题实现起来也不难,使用Hittest碰撞测试函数可以很好的解决这个问题,而判断是否到达终点的解决办法也一样,只不过碰撞的对象是终点的红色小球。

  制作步骤:

  在初步规划了游戏设计思路,考虑了游戏中要解决的问题的解决方法后,就可以着手制作游戏了。

  1.制作游戏主角:游戏主角是我们要控制的对象,所以首先来制作主角,因为游戏中需要使用键盘对主角进行控制,所以主角应该制作成MC,这里新建一个MC,命名为man,进入man的编辑状态后,在第1桢使用矩形工具和直线工具绘制一个简单的圆脸,如图2所示:

图2

  图2是主角在游戏中的状态,主角到达终点时候,会显示一张笑脸,所以在第2桢插入一个关键桢,使用矩形工具和铅笔工具绘制一个简单的笑脸,如图3所示:

图3
2.制作迷宫出口:游戏中迷宫的出口是由一个小球标识的,只要主角到达小球所在位置,则可判断游戏胜利,游戏中需要判断主角是否和小球发生碰撞,所以小球也需要制作成MC,新建一个MC,命名为exit,进入exit的编辑状态后,只需绘制一个有填充色的正圆即可,如图4所示:

图4

  3.制作重玩按钮:游戏中当然少不了开始,重玩一类的控制按钮,这里只需要一个重玩按钮即可,游戏启动后会自动进入开始状态。新建一个Button,命名为tryagain,进入tryagain的编辑状态后,可以按照自己的喜好绘制各种按钮,本例中重玩按钮的Up祯和Down桢如图5所示,Over祯如图6所示:

图5

图6

  4.制作迷宫墙壁:游戏中迷宫是由AS控制生成的,不需要人为的干预,所以只需要制作墙壁的基本部分,由程序控制将其拼接成完整的迷宫。这里可以制作两个MC,分别为水平墙壁和垂直墙壁,使用矩形工具绘制成园角矩形即可,如图7所示:

图7

  游戏的基本组件已经制作完了,非常的简单,剩下的工作就可以交给Action去处理了,在使用Action控制游戏之前,还需要布置主场景。

  布置主场景:

  回到主场景中,设置影片舞台大小为540px*400px,影片背景色为桔红色,然后将默认图层layer1重命名为tryagain,在第7桢插入一个关键祯,将组件tryagain放置到舞台靠右下的位置,还可以在按钮上添加一些提示信息,如”找到出口拉”,如图8所示:

图8

  新建一个图层,重命名为exit,在第5桢插入一个关键祯,然后从库中将出口小球exit拖到舞台上任意位置,并在属性面板中设置其Instance Name为exit,如图9所示:

图9
再新建一个图层,重命名为start&man,此图层放置游戏开始时构造迷宫地图的提示信息以及游戏的主角,在第1关键桢输入如图10所示的游戏开始提示信息:

图10

  然后在第5祯插入一个空白关键祯,将主角man拖到舞台的任意位置,并在属性面板中设置其Instance Name为man,如图11所示,并将此图层延续到第7祯:

图11
  添加Action:

  主场景布置好后,最后的任务就是添加Action控制代码了,新建一个图层,重命名为actions,在第4桢插入一个关键祯,并添加如下AS:

MazeH = 12;

MazeW = 12;

//定义变量MazeH和MazeW,分别代表迷宫地图的高度和宽度,高度以垂直墙壁为单位,//高度以水平墙壁为单位,分别为12个

TotalCells = MazeH*MazeW;

//定义变量TotalCells,其值为迷宫宽度和高度的乘积,代表了迷宫所能容纳的墙壁

//总数

Maze = new Array();

//定义一个数组Maze

for (i=0; i
Room = new Array();

Cell = new Array();

//定义两个新数组Room和Cell

Cell.push(true, true, true, true);

Cell.push(int(i/MazeW));

Cell.push(i%MazeW);

//使用数组对象的Push方法将参数值加到数组中,其中i/MazeW为I和Mazew相除且取//整数部分,I%MazeW取两者相除的余数部分

Room.push(Cell);

Maze.push(Room);

}//最后将数组Cell和Room分别加到数组Room和Maze中,作为数组中最后一个元素

while (true) {

roomNum = random(Maze.length);

cellNum = random(Maze[roomNum].length);

wallNum = random(4);

//分别取三个随机数,roomNum取数组Maze长度内的随机数,用来表示迷宫内的房间号,cellNum取数组Room长度内的随机数,因为roomNum是数组Maze的最大长度,所以数组Maze的第roomNum号元素就是其最后一个元素,也即数组Room。最后一个变量取4以内的随机数,代表房间内不同的四堵墙。

  上面的几个数组Maze,Room,Cell之间其实有一个包含与被包含的关系,因为Cell被加入到Room中,而Room又被加入到了Maze中,所以Maze是最外层的数组,其包含了数组Room而数组Room又包含了Cell,这样其实就建立了一个三维数组,Maze代表了整个的迷宫,其元素Room代表了迷宫中的房间,而room中的元素cell则代表了房间里的墙壁,这样层层嵌套,有利于实现下面的撞墙判断脚本。

if (Maze[roomNum][cellNum][wallNum] == false)

//判断Maze数组中编号为[roomNum][cellNum][wallNum]的元素值是否为假,如果为

//假,进行下一步循环

x = Maze[roomNum][cellNum][4];

y = Maze[roomNum][cellNum][5];

//分别设置x,y为第roomNum号房间的第cellNum堵墙的第4个和第5个元素

if (wallNum == 0 and x == mazeW-1) else if (wallNum == 1 and y == mazeH-1) else if (wallNum == 2 and x == 0) else if (wallNum == 3 and y == 0)

//对变量进行判断,然后执行相应的操作
oppsCell = new Array();

//定义新数组oppsCell

if (wallNum == 0) {

oppsCell = fun_findcell(x+1, y);

} else if (wallNum == 1) {

oppsCell = fun_findcell(x, y+1);

} else if (wallNum == 2) {

oppsCell = fun_findcell(x-1, y);

} else if (wallNum == 3) {

oppsCell = fun_findcell(x, y-1);

}

// 根据墙壁编号的不同,分别调用参数不同的函数,fun_findcell为自定义函数

if (oppsCell[0] == roomNum)

if (wallNum == 0) {

oppsWall = 2;

} else if (wallNum == 1) {

oppsWall = 3;

} else if (wallNum == 2) {

oppsWall = 0;

} else if (wallNum == 3) {

oppsWall = 1;

}

// 打开单元格中的一堵墙

Maze[roomNum][cellNum][wallNum] = false;

Maze[oppsCell[0]][oppsCell[1]][oppsWall] = false;

Maze[roomNum] = Maze[roomNum].concat(Maze[oppsCell[0]]);

Maze.splice(oppsCell[0], 1);

//用四个墙壁将空间封闭

if (Maze.length == 1)

}

function fun_findcell (a, b) {

reCell = new Array();

for (i=0; i
for (j=0; j
if (Maze[i][j][4] == a && Maze[i][j][5] == b) {

reCell.push(i, j);

return reCell;

}

}

}

}

//自定义函数fun_findcell,用来寻找没有封闭的单元格
在第5祯添加如下AS;

Maze=Maze[0];

cellW=30;

wn=0;

//定义三个变量

for (i=0; i
cellX = Maze[i][4];

cellY = Maze[i][5];

for (j=0; j<4; j++) {

if (Maze[i][j] == true) {

_root.attachMovie("w"+j, "ww"+wn, wn);

eval("ww"+wn)._x = 105+cellW*cellX;

eval("ww"+wn)._y = 35+cellW*cellY;

wn++;

}

}

}

//控制游戏主角在迷宫中运动,并对路线进行判断

man._x=105;

man._y=35;

//设置游戏主角的坐标

man.gotoAndStop(1);

//主角处于游戏进行状态

exit._x=105+11*cellW;

exit._y=35+11*cellW;

//设置迷宫出口坐标

manX = 0;

manY = 0;

  在第6祯和第7祯都添加AS; stop();,用以停止游戏进行,以便让玩家选择,同时设置第7祯的祯标签为playagain,接下来给重玩按钮设置AS;

on (release) {

for(i=0;i
removeMovieClip("ww"+i);

}

gotoAndPlay (1);

}

//将游戏中复制出的迷宫墙壁全部清除掉,然后回到游戏开始重新构造迷宫地图

  最后的时间轴如图12所式:

图12

  到此为止,迷宫游戏就制作完成了,可以看到,游戏中使用的对象非常少,主要功能全部由AS来实现,这也是用Flash制作游戏和一般动画很大的不同。


 
高手云集 版权所有 1998-2006