flash游戏制作教程之关卡设计流程
关卡的分类:关卡简言之。其实就是游戏中一个个串连的任务。从开发者的角度考虑,关卡一般可以分为以下两类
第一类:简单参数化关卡
这种游戏的难度级别可以用简单的参数变化来表示。比如汉诺塔游戏,汉诺塔层数的递增就构成了一级级的关卡,又比如扫雷游戏,不同的宽度、高度、雷数的组合形成不同的难度级别等等。
第二类:变换场景的关卡
这类游戏的关卡之间不是通过修改几个参数就可以解决的,它可能完全换了一个场景。其中的变化可能有:地图不同、敌人不同、任务不同等等。这种关卡在角色扮演游戏中比较多见。
总而言之,关卡类游戏可以归结为游戏平台设计、参数设计以及必须和两者关联的程序逻辑设计三个部分。如下图所示:
下面用一个实例给大家介绍:
游戏实例:战场生存过关版
现在我们将前面设计的游戏“战场生存记”改为带关卡的游戏。每个关卡的大炮数量不同,有的关卡还有地雷。只要玩家能够坚持住一定的时间即进入下一关。
先设计这个游戏的主流程图,如下图所示:
其中关卡数可以继续添加。具体设计时将此流程图的每个过程对应为Flash中的一帧或者连续的几帧,注意帧之间的跳转应尽量使用帧标签以适应开发时帧数的变化。
关卡是一段连续的帧,其程序结构如下图所示:
在关卡初始化阶段完成本关卡游戏场景的准备,布置大炮、地雷,以及初始化游戏场景。初始化完成后即进入游戏阶段,当游戏任务完成或者失败,在退出关卡之前,那些以后不再使用到的资源、代码,都要清除干净,以免影响程序的其它部分。
这里我们沿用战场生存记的角色和基本界面。故而这部分程序不再讲解。
具体步骤:
1.设计地雷角色
地雷角色与炮弹角色非常相似,但更简单,因为它不需要移动。这里仅给出其第1帧代码,角色的其余部分读者自行完成。
2.组织游戏程序
这个游戏完成时的时间轴如下图所示:
第1帧是游戏开始界面以及各个具体的函数。接下来是四个关卡,最后两帧分别是胜利/失败界面和全部过关界面。
角色图层放置着英雄角色实例(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);
}
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();
即游戏初始化后播放头停止,进入游戏中状态。
关卡结束帧负责处理垃圾清理工作,这里仅清除三个事件处理函数,其它垃圾的清理交给垃圾回收机制处理。这是取巧的方法,如果你的关卡结束后程序出现异常,那么估计就是垃圾没有清理完全的缘故。
stage.removeEventListener(KeyboardEvent.KEY_DOWN,heroRun);
stage.removeEventListener(KeyboardEvent.KEY_UP,heroStop);
stage.removeEventListener(Event.ENTER_FRAME,checkGame);
gotoAndStop("result");
其它几个关卡的初始化和垃圾清理代码与此类似,不再赘述。
成功/失败界面显示过关成功或者失败,并决定游戏的下一步走向。其代码如下:
stop();
if (level>=totalLevel&&victory==true) {
gotoAndStop("win");//胜利画面
} else {
if (victory) {
level++;
txtResult.text="闯关成功";
} else {
txtResult.text="闯关失败";
}
bt_continue.addEventListener(MouseEvent.MOUSE_DOWN,startGame);
}
游戏结束画面较为简单,代码如下:
stop();
level=1;
bt_restart.addEventListener(MouseEvent.MOUSE_DOWN,startGame);
它表示如果点击重玩按钮,游戏将重新从第一关开始玩。
3.测试游戏,直到达到预期的效果。
下图为这个游戏运行中的一个截图:
至此我们完成了过关类游戏的设计。
版权声明:本站【趣百科】文章素材来源于网络或者用户投稿,未经许可不得用于商用,如转载保留本文链接:https://www.qubaik.com/article/38587.html