资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,#,Flash,游戏编程,肖 刚,闽江学院电子系计算机教研室,Email:fuzhou3721,第八章 关卡设计,教学提要,游戏关卡模式(分类),关卡示例程序,掌握游戏中关卡设计的思路和技巧,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=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,本章小结,关卡类游戏的结构为:,游戏基础框架,+,参数化资源,。,基础框架是每个关卡共有的,而参数化资源是可以个性化修改的。设计时,基础框架不能依赖于任何参数化资源,而参数化资源可以在基础框架的基础上实现独立的功能。,本例中,游戏基础框架为游戏主体界面,小兵的跑动范围,游戏的逻辑模式(单人角色扮演游戏),人机交互等。而参数化资源为大炮、地雷、炮弹、障碍物等物件。,如果设计得当,增加关卡的工作就是可视化地布置场景的工作一样简单。例如本例中的大炮,作为关卡的一个资源,在任何一个关卡里面,只要将大炮拖放出来布置好即可。,
展开阅读全文