flash游戏制作教程之关卡设计流程
1、第一类:简单参数化关卡这种游戏的难度级别可以用简单的参数变化来表示。比如汉诺塔游戏,汉诺塔层数的递增就构成了一级级的关卡,又比如扫雷游戏,不同的宽度、高度、雷数的组合形成不同的难度级别等等。
2、第二类:变换场景的关卡这类游戏的关卡之间不是通过修改几个参数就可以解决的,它可能完全换了一个场景。其中的变化可能有:地图不同、敌人不同、任务不同等等。这种关卡在角色扮演游戏中比较多见。
3、总而言之,关卡类游戏可以归结为游戏平台设计、参数设计以及必须和两者关联的程序逻辑设计三个部分。如下图所示:
4、下面用一个实例给大家介绍: 游戏实例:战场生存过关版现在我们将前面设计的游戏“战场生存记”改为带关卡的游戏。每个关卡的大炮数量不同,有的关卡还有地雷。只要玩家能够坚持住一定的时间即进入下一关。先设计这个游戏的主流程图,如下图所示:
5、其中关卡数可以继续添加。具体设计时将此流程图的每个过程对应为Flash中的一帧或者连续的几帧,注意帧之间的跳转应尽量使用帧标签以适应开发时帧数的变化。关卡是一段连续的帧,其程序结构如下图所示:
6、在关卡初始化阶段完成本关卡游戏场景的准备,布置大炮、地雷,以及初始化游戏场景。初始化完成后即进入游戏阶段,当游垡幢踔笠戏任务完成或者失败,在退出关卡之前,那些以后不再使用到的资源、代码,都要清除干净,以免影响程序的其它部分。这里我们沿用战场生存记的角色和基本界面。故而这部分程序不再讲解。
7、具体步骤:1.设计地雷角色地雷角色与炮弹角色非常相似,但更简单,因为它不需要移动。这里仅给出其第1帧代码,角色的其余部分读者自行完成。
8、2.组织游戏程序这个游戏完成时的时间轴如下图所示:
9、第1帧是游戏开始界面以及各个具体的函数。接下来是四个关卡,最后两帧分别是胜利/失败界面和全部过关界面。角色图层放置着英雄角色实例(hero)、大炮和地雷等等。这些实例都是从库中直接拖出来,在可视化环境下布置好即可,不需要添加任何代码。
10、与战场生存记相比,程序多了几个筐毙险裆变量,它们分别是level(当前关卡)、totalLevel(关卡总数)、total皈其拄攥Time(关卡时限)、victory(胜利/失败)。这些变量在初始化程序和判断游戏流程时使用到。计时方式改为倒计时,判断游戏成败的方式亦有所不同。总之,第1帧的代码,与前一个游戏不同的部分如下所示:var level:int=1;var totalLevel=4;var totalTime:int;var victory:Boolean;function startGame(e:MouseEvent) {gotoAndPlay("level"+level);}function init() {victory=false;time=totalTime;timeCountShow.text=String(time);levelShow.text=String(level);startTime=new Date();hero.gotoAndStop("stop");stage.addEventListener(KeyboardEvent.KEY_DOWN,heroRun);//跑动stage.addEventListener(KeyboardEvent.KEY_UP,heroStop);//取消跑动stage.addEventListener(Event.ENTER_FRAME,checkGame);//检查游戏是否结束}function checkGame(e:Event) {showTime();if (hero.status=="dead") {play();//游戏失败,播放到关卡结束帧}if (time<=0) {hero.status="victory";victory=true;play();//游戏胜利,播放到关卡结束帧}}function showTime() {endTime=new Date();time=int((endTime.getTime()-startTime.getTime())/1000);time=totalTime-time;//倒计时timeCountShow.text=String(time);}
11、在关卡的起始帧进行关卡初始化,由于关卡的大部分功能都由自动化的剪辑完成,所以这段代码非常少,例如第一关的初始化代码为:totalTime=15;init();stop();
12、即游戏初奘疚豫枭始化后播放头停止,进入游戏中状态。关卡结束帧负责处理垃圾清理工作,这里仅清除三个事件处理函数,其它垃圾的清理交给垃圾回收机制处理。这是取巧的方法,如果你的关卡结束后程序出现异常,那么估计就是垃圾没有清理完全的缘故。stage.removeEventListener(KeyboardEvent.KEY_DOWN,heroRun);stage.removeEventListener(KeyboardEvent.KEY_UP,heroStop);stage.removeEventListener(Event.ENTER_FRAME,checkGame);gotoAndStop("result");
13、其它几个关卡的初始化和垃圾清理代码与此类似,不聪艄料姹再赘述。成功/失败界面显示过关成功或者失败,并决定游戏的下一步走向。其代码如下:stop();if (level>=totalLevel媪青怍牙&&victory==true) {gotoAndStop("win");//胜利画面} else {if (victory) {level++;txtResult.text="闯关成功";} else {txtResult.text="闯关失败";}bt_continue.addEventListener(MouseEvent.MOUSE_DOWN,startGame);}
14、游戏结束画面较为简单,代码如下:stop();level=1;bt_restart.addEventListener(MouseEvent.MOUSE_DOWN,startGame);它表示如果点击重玩按钮,游戏将重新从第一关开始玩。
15、3.测试游戏,直到达到预期的效果。下图为这个游戏运行中的一个截图:
16、至此我们完成了过关类游戏的设计。