“运动与健康”主题游戏《跑酷人生》的设计与实现郭鑫潘佳平摘要:本文为2012年第5届中国大学生计算机设计大赛参赛作品,一款运动类游戏《跑酷人生》的设计思路及其实现方案,并给出了相关的代码。
在此基础上,也对一般游戏的设计制作过程进行了探讨。
关键词:设计大赛跑酷运动与健康游戏引言:《跑酷人生》为一款具有时尚元素的运动类游戏,游戏在突出“运动与健康”主题的条件下,在传统动作游戏的基础上,增加了一些创新的元素。
游戏采用DarkGDK函数库实现。
一、设计思路:一款游戏主要由游戏内容(剧本)、游戏框架(引擎)和游戏素材(资源)等三大部分构成,当然,这中间有一些细节也能对游戏所产生的效果造成影响。
所以要从以下四个方面对游戏进行设计:游戏的表现主题;游戏整体框架;游戏素材;游戏细节。
这四个方面在时间维度上也是顺序进行的,即前一方面是后一方面的前提与基础。
二、确定游戏的内容表现“运动与健康”主题,传达积极向上的思想是本游戏的主旨。
所以设计者从这点出发,确定了游戏的内容:跑酷。
跑酷较其它运动更能展现“运动与健康”主题。
并且跑酷具有时尚、流行的特点,这也是本游戏较其它游戏更能吸引玩家、造成更大影响力的优势所在。
在确定了游戏内容的同时,也确定了游戏要对玩家传达的思想:越过重重障碍,永无止境的向前行进。
三、游戏框架设计在确定了游戏的设计宗旨后,则要开始对整体游戏框架进行设计。
为了能更好地体现跑酷运动的特点,传达本游戏所表达的“运动与健康”的精神(即跑酷精神),最终对游戏进行了如下设计:跑酷是永无止境的,除非前方无路可走,除非被困难所打倒,否则跑酷者会勇往直前,愈行愈远。
所以从游戏一开始,游戏的主角就在向前奔跑,只有当遇到障碍物时,他才会停下来等待玩家进行操作。
而且游戏摒弃了“通关”这一传统游戏的元素,取而代之的是得分,玩家每通过一个障碍物,他的得分都将提高。
并且根据玩家完成动作的完美度对玩家这次动作进行评级,若玩家得到“perfect”,那么他的分数将提高80分;若玩家得到“good”,那么他的分数将提高40分;若玩家得到“bad”,那么他的分数只提高20分。
在游戏结束时,玩家可以看到目前为止最高的得分。
在传统的动作游戏中,遇到障碍物时玩家需要按相应的按键使游戏中的角色通过跳跃、攀爬等动作通过障碍物,而本游戏采取了不同的做法。
由于跑酷是一项时尚的极限运动,故应在游戏中加入大量的时尚元素,所以游戏摒弃了传统动作游戏通过简单的按空格键和方向键来操作人物的动作这一玩法,将类似“炫舞”这一种音乐游戏的元素融入其中——当游戏角色遇到障碍物时,玩家必须按照屏幕上的提示,按下相应的组合键(上、下、左、右方向键)让角色顺利的通过障碍物。
如果按错键那么玩家将失去一次机会,玩家只有三次机会。
当然,仅仅这样处理无法体现跑酷运动的特点:1、跑酷充满了未知元素,跑酷者永远无法预料前方有什么危险在等待着他;2、跑酷具有行云流水、一气呵成的特点,在遇到障碍物时,如果因气馁而停下过长的时间,那么跑酷者将因失去助跑的动力而无法通过。
针对这两个特点,在游戏中引入了随机生成和时间条两种元素。
所谓随机生成,即游戏中障碍物出现的地点、出现的种类和玩家需要按下的按键组合都是随机的。
这让游戏充满了跑酷的氛围,也让游戏具有更好的耐玩性。
所谓时间条,即当游戏角色遇到障碍物时,屏幕上会显示一个不断减少的时间条,玩家必须在时间条消失前按下组合键,否则将失去一次机会,玩家只有三次机会。
四、游戏素材设计在进行完游戏框架设计后,则要对游戏需要的素材进行设计。
本游戏的素材设计的整体思想是:能更好地表现跑酷运动的特点,绝对不能出现暴力和不健康的画面。
所以在整体上设计者运用了Q版的形式使游戏更加生动,充满健康、积极向上的气息。
同时为了使角色动作更漂亮,游戏画面更精致,放弃3D 而采用2D。
不失一般性,本游戏素材分别从以下几点进行设计:角色动作;角色装束;背景和障碍物;音乐和音效。
1、角色动作设计:由于跑酷是一项极具观赏性的运动,所以对角色动作的设计就显得十分重要和必要。
考虑到人手与时间的限制,若将所有的跑酷动作都制作出来,那么素材制作量会太大,于是设计者从现实跑酷动作中选取有代表性、具有较高观赏性的动作作为模板,来进行角色动作的制作。
综合分析后选取了7个较典型的动作。
每个动作都通过胶片动画进行表现,使人物的动作更加清晰、美观。
2、角色装束:为了使游戏的时尚性更加明显,也为了突出跑酷者的特点,设计者根据现实中跑酷者的装束特点对角色进行了设计,并且在细节上对角色的装束进行了细化:比如角色手上戴着护腕,脚上穿着红色的运动鞋,跑动的时候碎发会向后飘动等等。
3、背景和障碍物跑酷是一项街头极限运动,虽然跑酷可以在任何场地进行,但绝大多数跑酷还是在城市中进行的。
所以设计者决定以Q版的城市作为游戏背景。
并且设计了商店、墙壁、涂鸦等各种时尚的背景元素。
为了使游戏体现出生动活波的特点,紧扣健康向上的主题,针对游戏角色的七个跑酷动作,设计了七种卡通风格的障碍物。
4、音乐和音效我们力图将游戏打造成一款健康、绿色、充满时尚气息的游戏,所以在音乐的选取上选择使用比较振奋人心、节奏感较强的音乐。
所以在游戏的标题画面,设计者选择使用《I said I’m Naruto》来作为背景音乐;在关卡界面,选择使用摇滚风格的音乐作为背景音乐。
在音效方面,使用了简明清晰的音效,使得游戏不显得单调。
例如在关卡刚开始时,会播放“ready? go!”的音效,提醒玩家注意,游戏即将开始;在游戏结束时,会播放“game over”的音效,向玩家说明游戏已经结束。
而且,配合人物的七种跑酷动作,也设计了七套不同的音效,用于在人物越过障碍物时播放。
五、游戏细节设计细节决定成败,在一款游戏设计的最后阶段,对游戏细节的设计显得十分必要和重要。
在分析了游戏还有所欠缺的地方后,设计者从四个方面对游戏的细节进行了设计:1、标题画面将原来单调的游戏标题画面做了改变,在加载游戏时增加显示“now loading”语句,加载完后播放一个跑酷人物和标题飞入窗口的动画,使游戏更加动感,充满活力。
2、说明文字增加“游戏说明”这一选项,若玩家不知道游戏怎样进行操作,在标题界面可以选择进入游戏说明界面,这时将出现图文来为玩家说明游戏的玩法。
3、进入画面在正式进入游戏关卡时,增加一个渐变的,类似于电影字幕的画面,上面显示这样一句话“人生就像一场跑酷,只有越过重重障碍,才能跑得更远!”,这不仅体现了我们游戏所要弘扬的精神,也突出了“运动与健康”的主题。
4、游戏图标游戏图标采用一个“酷”字的造型,并且在“酷”字上增加两个眼睛,这样显得更加生动有趣。
六、实现过程对于一款游戏来说,按照经典的用户\界面模式,可将其实现分为三大模块:游戏框架模块:用于游戏整体流程控制和场景转换;动画和声音模块:用于显示图片、播放动画和声音;文件数据模块:用于记录玩家的数据。
1、游戏框架使用DarkGDK引擎的入口函数为void DarkGDK(void){}。
在DarkGDK()函数中设置屏幕刷新频率、刷新屏幕,并启动一个游戏循环,用于不断获取用户的输入,与用户进行交互,并播放动画和声音。
部分代码如下:void DarkGDK ( void ){//载入画面dbSetTextFont("Comic Sans MS");dbSetTextSize(35);dbText(215,200,"now loading...");dbSync();//初始信息设置gameSetup();//隐藏鼠标dbHideMouse();//游戏循环while(LoopGDK ( ) && !gameOver){game();//刷新屏幕dbSync();}return;}其中,gameSetup()函数用来初始化游戏信息,具体代码如下:void gameSetup(){//禁止自动刷新dbSyncOn ( );//设置刷新频率dbSyncRate ( 60 );//设置窗口标题dbSetWindowTitle("跑酷人生");//设置窗口大小dbSetDisplayMode(640,480,dbScreenDepth());//加载图片loadImages();}game()函数控制着整个游戏的流程,在game()函数中维持着一个全局的枚举变量eGameMode,eGameMode的值根据玩家的键盘输入不断的发生变化,game()通过对eGameMode值的判断,来进入不同的游戏场景。
具体代码如下:void game(){switch(eGameMode){case eGameTitle://开始界面gameTitle();break;case eGameLevel://游戏关卡gameLevel();break;case eGamePlayWord://显示开始文字gamePlayWord();break;case eGameLevelWait://关卡等待gameLevelWait();break;case eGameLose://游戏失败界面gameLose();break;case eGameIntroduce://游戏介绍画面gameIntroduce();break;}}其中gameTitle()、gameLevel()等函数不同的场景函数,在不同的场景中将播放不同的动画和声音,与玩家发生不同的交互,如在游戏的开始界面,有“新游戏”、“游戏帮组”、“退出”等选项供玩家选择;在游戏介绍界面,将为玩家展示一个游戏的操作说明。
场景函数中最主要的是gameLevel(),即游戏关卡函数,它控制着游戏主要的流程。
gameLevel()函数的代码如下:void gameLevel(){//判断是否失败if(lose)eGameMode=eGameLose;//显示背景dbPasteImage(1,0,0);//显示滚动背景if(pasteBx<=-3840)pasteBx=0;//显示人物精灵动画dbSprite(1,pasteBx,0,2);//改变跑动速度mapSpeed=6+goal/1000*2;//卷动背景if(trbolFlag<=2)pasteBx-=6;//显示生命值dbSprite(25,10,28,90);showNum(27,life,120,30);//显示得分dbSprite(32,360,30,120);showNum(28,goal,500,30);//生命消耗动画及声音if(dead && !lose){dbPlaySprite(26,1,7,100);dbSprite(26,10,0,91);if(dbSpriteFrame(26)==1)dbPlaySound(4);if(dbSpriteFrame(26)==7)dead=false;}//播放关卡背景音乐dbLoopMusic(2);//显示人物奔跑动画if(trbolFlag!=4){dbPlaySprite(11,1,12,100);dbSprite(11,40,345,101);dbShowSprite(11);}//出现障碍物,随机生成障碍物种类if(randTrbol() && trbolFlag==1){int seed=dbTimer();dbRandomize(seed);int kind=dbRND(6);//根据障碍物的种类初始化障碍物显示坐标、动画显示坐标、显示动画种类switch(kind){case 0:carx=56;trbolx2=142;trboly=387;pCa=carOne;trboli=140;bmove=2;break;……// case 1:}trbolFlag=2;}//偏移障碍物位置if(trbolFlag==2){//若障碍物是6if(pCa==&carSix){dbSprite(38,trbolx,trboly,145);dbSprite(39,trbolx+50,trboly+71,146);trbolx-=6;}else{dbSprite(38,trbolx,trboly,trboli);trbolx-=6;}}if(trbolFlag==3 && countKy<=randKey){dbPlaySprite(8,1,21,100);dbSprite(8,ptimeX,170,51);waitKey();}//播放跳跃动画if(trbolFlag==4){pCa();pasteBx-=bmove;}……// if(trbolFlag==1)//播放字符动画if(playWord){if(playWord==1){dbPlaySprite(20,1,6,100);dbSprite(20,240,140,52);if(dbSpriteFrame(20)==6)playWord=0;}……// if(playWord==1)}}2、动画和声音模块本游戏动画和声音均使用DarkGDK函数库的相关函数进行播放。