FlashFlash游戏编程之关卡设游戏编程之关卡设计分析计分析第八章第八章 关卡设计关卡设计 教学提要游戏关卡模式(分类)游戏关卡模式(分类)关卡示例程序关卡示例程序※掌握游戏中关卡设计的思路和技巧掌握游戏中关卡设计的思路和技巧 1 引言引言 人类似乎对战胜困难充满热情,当一个个难关人类似乎对战胜困难充满热情,当一个个难关被攻破时,玩家从中获得了成长或者荣誉,一被攻破时,玩家从中获得了成长或者荣誉,一种过五关斩六将的自豪感油然而生种过五关斩六将的自豪感油然而生任何游戏都有由易到难的内在跨度,将不同难任何游戏都有由易到难的内在跨度,将不同难度串连起来,既丰富了游戏的内涵,又扩大了度串连起来,既丰富了游戏的内涵,又扩大了游戏的目标玩家所以设计关卡成了大多数游游戏的目标玩家所以设计关卡成了大多数游戏的选择戏的选择 那么到底什么是关卡?有何技术难点?如何具那么到底什么是关卡?有何技术难点?如何具体实现呢?体实现呢? 2.1 关卡的分类关卡的分类 关卡其实就是游戏中一个个串连的任务关卡其实就是游戏中一个个串连的任务从开发者的角度考虑,关卡可以分为以从开发者的角度考虑,关卡可以分为以下两类:下两类: 简单参数化关卡简单参数化关卡变换场景的关卡变换场景的关卡 2.2 简单参数化关卡简单参数化关卡这种游戏的难度级别可以用简单的参数变化来表示。
这种游戏的难度级别可以用简单的参数变化来表示比如比如汉诺塔游戏,汉诺塔层数的递增就构成了一级级的关卡汉诺塔游戏,汉诺塔层数的递增就构成了一级级的关卡扫雷游戏,不同的宽度、高度、雷数的组合形成不同的难度扫雷游戏,不同的宽度、高度、雷数的组合形成不同的难度级别 还有?还有?设计这类游戏的关卡非常容易,只要在初始化游戏中设计这类游戏的关卡非常容易,只要在初始化游戏中场景前,修改这些参数即可根据新的参数构建的游场景前,修改这些参数即可根据新的参数构建的游戏场景自然就形成新的关卡了戏场景自然就形成新的关卡了更加直接的说,这类游戏的关卡,只要在初始化游戏更加直接的说,这类游戏的关卡,只要在初始化游戏时使用一个自定义的时使用一个自定义的selectMode函数即可解决函数即可解决 2.2 简单参数化关卡简单参数化关卡下面的代码是某扫雷游戏的下面的代码是某扫雷游戏的selectMode函数,它通过下拉框选函数,它通过下拉框选择预设难度级别从下拉框中选择一个难度,程序就将难度参数择预设难度级别从下拉框中选择一个难度,程序就将难度参数保存在三个文本框以便用户自定义修改以及初始化游戏之用保存在三个文本框以便用户自定义修改以及初始化游戏之用。
comboMode.addEventListener(Event.CHANGE,selectMode);function selectMode(evt:Event) {switch (evt.target.value) {case "1" :txtLineCount.text=String(8);txtRowCount.text=String(8);txtMineCount.text=String(10);break;case "2" :txtLineCount.text=String(14);txtRowCount.text=String(14);txtMineCount.text=String(35);break;}} 2.3 变换场景的关卡变换场景的关卡 这类游戏的关卡之间不是通过修改几个参数就这类游戏的关卡之间不是通过修改几个参数就可以解决的,它可能完全换了一个场景其中可以解决的,它可能完全换了一个场景其中的变化可能有:地图不同、敌人不同、任务不的变化可能有:地图不同、敌人不同、任务不同等等这种关卡在角色扮演游戏中比较多见这种关卡在角色扮演游戏中比较多见这种类型的关卡初看起来似乎比前者难多了。
这种类型的关卡初看起来似乎比前者难多了但事实上,如果开发者充分运用了面向对象的但事实上,如果开发者充分运用了面向对象的程序设计思想,将游戏中的各种组成部分模块程序设计思想,将游戏中的各种组成部分模块化,那么,搭建一个新的关卡,就象搭积木一化,那么,搭建一个新的关卡,就象搭积木一样简单结合样简单结合Flash优秀的可视化设计,添加优秀的可视化设计,添加一个关卡一个关卡甚至连一行代码都不用添加甚至连一行代码都不用添加 2.3 变换场景的关卡变换场景的关卡关键是理清楚关卡之间的异同,并将差异规整成规范的模关键是理清楚关卡之间的异同,并将差异规整成规范的模式 例如经典的搬运工游戏其关卡之间的唯一差异是地图不例如经典的搬运工游戏其关卡之间的唯一差异是地图不同于是将地图的格式规范化,那么只要导入新地图的数同于是将地图的格式规范化,那么只要导入新地图的数据即可就进入下一关,这和参数化关卡已经非常接近了据即可就进入下一关,这和参数化关卡已经非常接近了再比如设计类似仙剑奇侠传的游戏经分析,关卡之间的再比如设计类似仙剑奇侠传的游戏经分析,关卡之间的差异无非是地图不同、对话内容不同、任务不同、敌人不差异无非是地图不同、对话内容不同、任务不同、敌人不同、角色等级或装备等的不同。
那么只要将地图表示、对同、角色等级或装备等的不同那么只要将地图表示、对话方式、任务模式、战斗方式、角色属性等等都规范化话方式、任务模式、战斗方式、角色属性等等都规范化成一成一个固定的模式,由游戏基础框架(或游戏引擎)提供支持个固定的模式,由游戏基础框架(或游戏引擎)提供支持,那么设计,那么设计一个新的关卡,就简化成绘制一张新地图、编写一份新对一个新的关卡,就简化成绘制一张新地图、编写一份新对话文本、设定新胜利条件、放置新角色位置、设置新角色话文本、设定新胜利条件、放置新角色位置、设置新角色属性与行为等工作属性与行为等工作如果设计得当,其中多数工作并不需要编写代码,除非要如果设计得当,其中多数工作并不需要编写代码,除非要基于这些数据设计特殊的游戏逻辑基于这些数据设计特殊的游戏逻辑 2.3 变换场景的关卡变换场景的关卡总而言之,关卡类游戏可以归结为游戏平台设计、参总而言之,关卡类游戏可以归结为游戏平台设计、参数设计以及必须和两者关联的程序逻辑设计三个部分数设计以及必须和两者关联的程序逻辑设计三个部分如下图所示:如下图所示:这里的参数是广义的概念,各种角色、资源、对象都这里的参数是广义的概念,各种角色、资源、对象都是一种参数中的一种。
是一种参数中的一种 3 游戏实例:战场生存过关版游戏实例:战场生存过关版 游戏描述:游戏描述:将前面设计的游戏将前面设计的游戏“战场生存记战场生存记”改为带关改为带关卡的游戏每个关卡的大炮数量不同,有的卡的游戏每个关卡的大炮数量不同,有的关卡还有地雷或者障碍物只要玩家能够坚关卡还有地雷或者障碍物只要玩家能够坚持住一定的时间即进入下一关持住一定的时间即进入下一关 3.1 主流程图主流程图先设计这个游戏的主流程图,如下图所先设计这个游戏的主流程图,如下图所示:示: 其中关卡数可以继续添加具体设计时将此流程图的每其中关卡数可以继续添加具体设计时将此流程图的每个过程对应为个过程对应为Flash中的一帧或者连续的几帧,注意帧之中的一帧或者连续的几帧,注意帧之间的跳转应尽量使用帧标签以适应开发时帧数的变化间的跳转应尽量使用帧标签以适应开发时帧数的变化 3.2 关卡的结构关卡的结构关卡是一段连续的帧,其程序结构如下关卡是一段连续的帧,其程序结构如下图所示:图所示: 3.2 关卡的结构关卡的结构关卡初始化阶段:完成本关卡游戏场景关卡初始化阶段:完成本关卡游戏场景的准备,布置大炮、地雷,以及初始化的准备,布置大炮、地雷,以及初始化游戏场景。
游戏场景游戏阶段:当游戏任务完成或者失败,游戏阶段:当游戏任务完成或者失败,在退出关卡之前,那些以后不再使用到在退出关卡之前,那些以后不再使用到的资源、代码,都要清除干净,以免影的资源、代码,都要清除干净,以免影响程序的其它部分响程序的其它部分 3.3 具体步骤具体步骤设计地雷角色设计地雷角色 地雷角色与炮弹角色非常相似,但更简单,因为它地雷角色与炮弹角色非常相似,但更简单,因为它不需要移动这里仅给出其第不需要移动这里仅给出其第1帧代码,角色的其帧代码,角色的其余部分读者自行完成余部分读者自行完成 stop();var enemy:MovieClip=MovieClip(parent.getChildByName("hero"));addEventListener(Event.ENTER_FRAME,repeat);function repeat(e:Event) {if (enemy==null) {return;}if (hitTestObject(enemy)) {//碰到敌人了碰到敌人了gotoAndPlay("bomb");//自身爆炸自身爆炸enemy.dead();//指示敌人死去指示敌人死去}} 组织游戏程序组织游戏程序这个游戏完成时的时间轴如下图所示:这个游戏完成时的时间轴如下图所示: 第第1帧是游戏开始界面以及各个具体的函数。
接下帧是游戏开始界面以及各个具体的函数接下来是四个关卡,最后两帧分别是胜利来是四个关卡,最后两帧分别是胜利/失败界面和全失败界面和全部过关界面部过关界面3.3 具体步骤具体步骤3.3 具体步骤具体步骤内容描述内容描述角色图层放置着英雄角色实例(角色图层放置着英雄角色实例(hero)、大炮和地雷等等大炮和地雷等等这些实例都是从库中直接拖出来,在可视化环境下布置好即这些实例都是从库中直接拖出来,在可视化环境下布置好即可与战场生存记相比,程序多了几个变量,它们分别是与战场生存记相比,程序多了几个变量,它们分别是level(当前关卡)、(当前关卡)、totalLevel(关卡总数)、(关卡总数)、totalTime(关卡(关卡时限)、时限)、victory(胜利(胜利/失败)这些变量在初始化程序和失败)这些变量在初始化程序和判断游戏流程时使用到计时方式改为倒计时,判断游戏成判断游戏流程时使用到计时方式改为倒计时,判断游戏成败的方式亦有所不同如何不同?败的方式亦有所不同如何不同? 第第1帧的代码,与前一个游戏不同的部分帧的代码,与前一个游戏不同的部分如下所示:如下所示: var level:int=1;var totalLevel=4;var totalTime:int;var victory:Boolean;function startGame(e:MouseEvent) {gotoAndPlay("level"+level);}3.3 具体步骤具体步骤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);} 关卡初始化关卡初始化由于关卡的大部分功能都由自动化的剪辑完由于关卡的大部分功能都由自动化的剪辑完成,所以这段代码非常少,例如第一关的初成,所以这段代码非常少,例如第一关的初始化代码为:始化代码为:totalTime=15;init();stop(); 即游戏关卡初始化后播放头停止,进入游戏即游戏关卡初始化后播放头停止,进入游戏中状态。
中状态 3.3 具体步骤具体步骤垃圾清理工作垃圾清理工作——关卡结束帧关卡结束帧关卡结束帧负责处理垃圾清理工作,这里仅清除三关卡结束帧负责处理垃圾清理工作,这里仅清除三个事件处理函数,其它垃圾的清理交给垃圾回收机个事件处理函数,其它垃圾的清理交给垃圾回收机制处理这是取巧的方法,如果你的关卡结束后程制处理这是取巧的方法,如果你的关卡结束后程序出现异常,那么估计就是垃圾没有清理完全的缘序出现异常,那么估计就是垃圾没有清理完全的缘故stage.removeEventListener(KeyboardEvent.KEY_DOWN,heroRun);stage.removeEventListener(KeyboardEvent.KEY_UP,heroStop);stage.removeEventListener(Event.ENTER_FRAME,checkGame);gotoAndStop(“result”); ※※其它几个关卡的初始化和垃圾清理代码与此类似不再其它几个关卡的初始化和垃圾清理代码与此类似不再赘述赘述3.3 具体步骤具体步骤3.3 具体步骤具体步骤成功成功/失败界面失败界面显示过关成功或者失败,并决定游戏的下一步走向。
显示过关成功或者失败,并决定游戏的下一步走向其代码如下:其代码如下:stop();if (level>=totalLevel&&victory==true) {gotoAndStop("win");//胜利画面胜利画面} else {if (victory) {level++;txtResult.text="闯关成功闯关成功";} else {txtResult.text="闯关失败闯关失败";}bt_continue.addEventListener(MouseEvent.MOUSE_DOWN,startGame);} 3.3 具体步骤具体步骤游戏结束界面游戏结束界面较为简单,代码如下:较为简单,代码如下:stop();level=1;bt_restart.addEventListener(MouseEvent.MOUSE_DOWN,startGame); 它表示如果点击重玩按钮,游戏将重新从第一它表示如果点击重玩按钮,游戏将重新从第一关开始玩关开始玩4 测试程序测试程序测试游戏,直到达到预期的效果测试游戏,直到达到预期的效果下图为这个游戏运行中的一个截图:下图为这个游戏运行中的一个截图: 5 本章小结本章小结 关卡类游戏的结构为:关卡类游戏的结构为:游戏基础框架游戏基础框架+参数化资源参数化资源。
基础框架是每个关卡共有的,而参数化资源是可以个基础框架是每个关卡共有的,而参数化资源是可以个性化修改的设计时,基础框架不能依赖于任何参数性化修改的设计时,基础框架不能依赖于任何参数化资源,而参数化资源可以在基础框架的基础上实现化资源,而参数化资源可以在基础框架的基础上实现独立的功能独立的功能本例中,游戏基础框架为游戏主体界面,小兵的跑动本例中,游戏基础框架为游戏主体界面,小兵的跑动范围,游戏的逻辑模式(单人角色扮演游戏),人机范围,游戏的逻辑模式(单人角色扮演游戏),人机交互等而参数化资源为大炮、地雷、炮弹、障碍物交互等而参数化资源为大炮、地雷、炮弹、障碍物等物件如果设计得当,增加关卡的工作就是可视化地布置场如果设计得当,增加关卡的工作就是可视化地布置场景的工作一样简单例如本例中的大炮,作为关卡的景的工作一样简单例如本例中的大炮,作为关卡的一个资源,在任何一个关卡里面,只要将大炮拖放出一个资源,在任何一个关卡里面,只要将大炮拖放出来布置好即可来布置好即可 结束结束 。