




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Flash游戲編程
肖剛閩江學(xué)院電子系計(jì)算機(jī)教研室Email:fuzhou3721@163第八章關(guān)卡設(shè)計(jì)教學(xué)提要游戲關(guān)卡模式(分類)關(guān)卡示例程序駕馭游戲中關(guān)卡設(shè)計(jì)的思路和技巧1引言人類似乎對(duì)戰(zhàn)勝困難充溢熱忱,當(dāng)一個(gè)個(gè)難關(guān)被攻破時(shí),玩家從中獲得了成長(zhǎng)或者榮譽(yù),一種過五關(guān)斬六將的傲慢感油然而生。任何游戲都有由易到難的內(nèi)在跨度,將不同難度串連起來,既豐富了游戲的內(nèi)涵,又?jǐn)U大了游戲的目標(biāo)玩家。所以設(shè)計(jì)關(guān)卡成了大多數(shù)游戲的選擇。那么原委什么是關(guān)卡?有何技術(shù)難點(diǎn)?如何具體實(shí)現(xiàn)呢?2.1關(guān)卡的分類關(guān)卡其實(shí)就是游戲中一個(gè)個(gè)串連的任務(wù)。從開發(fā)者的角度考慮,關(guān)卡可以分為以下兩類:簡(jiǎn)潔參數(shù)化關(guān)卡變換場(chǎng)景的關(guān)卡2.2簡(jiǎn)潔參數(shù)化關(guān)卡這種游戲的難度級(jí)別可以用簡(jiǎn)潔的參數(shù)變更來表示。比如漢諾塔游戲,漢諾塔層數(shù)的遞增就構(gòu)成了一級(jí)級(jí)的關(guān)卡。掃雷游戲,不同的寬度、高度、雷數(shù)的組合形成不同的難度級(jí)別。還有?設(shè)計(jì)這類游戲的關(guān)卡特殊簡(jiǎn)潔,只要在初始化游戲中場(chǎng)景前,修改這些參數(shù)即可。依據(jù)新的參數(shù)構(gòu)建的游戲場(chǎng)景自然就形成新的關(guān)卡了。更加干脆的說,這類游戲的關(guān)卡,只要在初始化游戲時(shí)運(yùn)用一個(gè)自定義的selectMode函數(shù)即可解決。2.2簡(jiǎn)潔參數(shù)化關(guān)卡下面的代碼是某掃雷游戲的selectMode函數(shù),它通過下拉框選擇預(yù)設(shè)難度級(jí)別。從下拉框中選擇一個(gè)難度,程序就將難度參數(shù)保存在三個(gè)文本框。以便用戶自定義修改以及初始化游戲之用。comboMode.addEventListener(Event.CHANGE,selectMode);functionselectMode(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變換場(chǎng)景的關(guān)卡這類游戲的關(guān)卡之間不是通過修改幾個(gè)參數(shù)就可以解決的,它可能完全換了一個(gè)場(chǎng)景。其中的變更可能有:地圖不同、敵人不同、任務(wù)不同等等。這種關(guān)卡在角色扮演游戲中比較多見。這種類型的關(guān)卡初看起來似乎比前者難多了。但事實(shí)上,假如開發(fā)者充分運(yùn)用了面對(duì)對(duì)象的程序設(shè)計(jì)思想,將游戲中的各種組成部分模塊化,那么,搭建一個(gè)新的關(guān)卡,就象搭積木一樣簡(jiǎn)潔。結(jié)合Flash優(yōu)秀的可視化設(shè)計(jì),添加一個(gè)關(guān)卡甚至連一行代碼都不用添加。2.3變換場(chǎng)景的關(guān)卡關(guān)鍵是理清晰關(guān)卡之間的異同,并將差異規(guī)整成規(guī)范的模式。例如經(jīng)典的搬運(yùn)工游戲。其關(guān)卡之間的唯一差異是地圖不同。于是將地圖的格式規(guī)范化,那么只要導(dǎo)入新地圖的數(shù)據(jù)即可就進(jìn)入下一關(guān),這和參數(shù)化關(guān)卡已經(jīng)特殊接近了。再比如設(shè)計(jì)類似仙劍奇?zhèn)b傳的游戲。經(jīng)分析,關(guān)卡之間的差異無非是地圖不同、對(duì)話內(nèi)容不同、任務(wù)不同、敵人不同、角色等級(jí)或裝備等的不同。那么只要將地圖表示、對(duì)話方式、任務(wù)模式、戰(zhàn)斗方式、角色屬性等等都規(guī)范化成一個(gè)固定的模式,由游戲基礎(chǔ)框架(或游戲引擎)供應(yīng)支持,那么設(shè)計(jì)一個(gè)新的關(guān)卡,就簡(jiǎn)化成繪制一張新地圖、編寫一份新對(duì)話文本、設(shè)定新成功條件、放置新角色位置、設(shè)置新角色屬性與行為等工作。假如設(shè)計(jì)得當(dāng),其中多數(shù)工作并不須要編寫代碼,除非要基于這些數(shù)據(jù)設(shè)計(jì)特殊的游戲邏輯。2.3變換場(chǎng)景的關(guān)卡總而言之,關(guān)卡類游戲可以歸結(jié)為游戲平臺(tái)設(shè)計(jì)、參數(shù)設(shè)計(jì)以及必需和兩者關(guān)聯(lián)的程序邏輯設(shè)計(jì)三個(gè)部分。如下圖所示:這里的參數(shù)是廣義的概念,各種角色、資源、對(duì)象都是一種參數(shù)中的一種。
3游戲?qū)嵗簯?zhàn)場(chǎng)生存過關(guān)版游戲描述:將前面設(shè)計(jì)的游戲“戰(zhàn)場(chǎng)生存記”改為帶關(guān)卡的游戲。每個(gè)關(guān)卡的大炮數(shù)量不同,有的關(guān)卡還有地雷或者障礙物。只要玩家能夠堅(jiān)持住確定的時(shí)間即進(jìn)入下一關(guān)。3.1主流程圖先設(shè)計(jì)這個(gè)游戲的主流程圖,如下圖所示:其中關(guān)卡數(shù)可以接著添加。具體設(shè)計(jì)時(shí)將此流程圖的每個(gè)過程對(duì)應(yīng)為Flash中的一幀或者連續(xù)的幾幀,留意幀之間的跳轉(zhuǎn)應(yīng)盡量運(yùn)用幀標(biāo)簽以適應(yīng)開發(fā)時(shí)幀數(shù)的變更。3.2關(guān)卡的結(jié)構(gòu)關(guān)卡是一段連續(xù)的幀,其程序結(jié)構(gòu)如下圖所示:3.2關(guān)卡的結(jié)構(gòu)關(guān)卡初始化階段:完成本關(guān)卡游戲場(chǎng)景的準(zhǔn)備,布置大炮、地雷,以及初始化游戲場(chǎng)景。游戲階段:當(dāng)游戲任務(wù)完成或者失敗,在退出關(guān)卡之前,那些以后不再運(yùn)用到的資源、代碼,都要清除干凈,以免影響程序的其它部分。3.3具體步驟設(shè)計(jì)地雷角色地雷角色與炮彈角色特殊相像,但更簡(jiǎn)潔,因?yàn)樗豁氁苿?dòng)。這里僅給出其第1幀代碼,角色的其余部分讀者自行完成。stop();varenemy:MovieClip=MovieClip(parent.getChildByName("hero"));addEventListener(Event.ENTER_FRAME,repeat);functionrepeat(e:Event){ if(enemy==null){ return; } if(hitTestObject(enemy)){//遇到敵人了 gotoAndPlay("bomb");//自身爆炸 enemy.dead();//指示敵人死去 }}組織游戲程序這個(gè)游戲完成時(shí)的時(shí)間軸如下圖所示:第1幀是游戲起先界面以及各個(gè)具體的函數(shù)。接下來是四個(gè)關(guān)卡,最終兩幀分別是成功/失敗界面和全部過關(guān)界面。3.3具體步驟3.3具體步驟內(nèi)容描述角色圖層放置著英雄角色實(shí)例(hero)、大炮和地雷等等。這些實(shí)例都是從庫中干脆拖出來,在可視化環(huán)境下布置好即可。與戰(zhàn)場(chǎng)生存記相比,程序多了幾個(gè)變量,它們分別是level(當(dāng)前關(guān)卡)、totalLevel(關(guān)卡總數(shù))、totalTime(關(guān)卡時(shí)限)、victory(成功/失?。_@些變量在初始化程序和推斷游戲流程時(shí)運(yùn)用到。計(jì)時(shí)方式改為倒計(jì)時(shí),推斷游戲成敗的方式亦有所不同。如何不同?第1幀的代碼,與前一個(gè)游戲不同的部分如下所示:varlevel:int=1;vartotalLevel=4;vartotalTime:int;varvictory:Boolean;functionstartGame(e:MouseEvent){ gotoAndPlay("level"+level);}3.3具體步驟functioninit(){ victory=false; time=totalTime; timeCountShow.text=String(time); levelShow.text=String(level); startTime=newDate(); hero.gotoAndStop("stop"); stage.addEventListener(KeyboardEvent.KEY_DOWN,heroRun);//跑動(dòng) stage.addEventListener(KeyboardEvent.KEY_UP,heroStop);//取消跑動(dòng) stage.addEventListener(Event.ENTER_FRAME,checkGame);//檢查游戲是否結(jié)束}functioncheckGame(e:Event){ showTime(); if(hero.status=="dead"){ play();//游戲失敗,播放到關(guān)卡結(jié)束幀 } if(time<=0){ hero.status="victory"; victory=true; play();//游戲成功,播放到關(guān)卡結(jié)束幀 }}functionshowTime(){ endTime=newDate(); time=int((endTime.getTime()-startTime.getTime())/1000); time=totalTime-time;//倒計(jì)時(shí) timeCountShow.text=String(time);}關(guān)卡初始化由于關(guān)卡的大部分功能都由自動(dòng)化的剪輯完成,所以這段代碼特殊少,例如第一關(guān)的初始化代碼為:totalTime=15;init();stop();即游戲關(guān)卡初始化后播放頭停止,進(jìn)入游戲中狀態(tài)。3.3具體步驟垃圾清理工作——關(guān)卡結(jié)束幀關(guān)卡結(jié)束幀負(fù)責(zé)處理垃圾清理工作,這里僅清除三個(gè)事務(wù)處理函數(shù),其它垃圾的清理交給垃圾回收機(jī)制處理。這是取巧的方法,假如你的關(guān)卡結(jié)束后程序出現(xiàn)異樣,那么估計(jì)就是垃圾沒有清理完全的緣由。stage.removeEventListener(KeyboardEvent.KEY_DOWN,heroRun);stage.removeEventListener(KeyboardEvent.KEY_UP,heroStop);stage.removeEventListener(Event.ENTER_FRAME,checkGame);gotoAndStop(“result”);※其它幾個(gè)關(guān)卡的初始化和垃圾清理代碼與此類似不再贅述3.3具體步驟3.3具體步驟成功/失敗界面顯示過關(guān)成功或者失敗,并確定游戲的下一步走向。其代碼如下:stop();if(level>=totalLevel&&victory==true){ gotoAndStop("win");//成功畫面}else{ if(victory){ level++; txtResult.text="闖關(guān)成功"; }else{ txtResult.text="闖關(guān)失敗"; } bt_continue.addEventListener(MouseEvent.MOUSE_DOWN,startGame);}3.3具體步驟游戲結(jié)束界面較為簡(jiǎn)潔,代碼如下:stop();level=1;bt_restart.addEventListener(MouseEvent.MOUSE_DOWN,startGame);它表示假如點(diǎn)擊重玩按鈕,游戲?qū)⒅匦聫牡谝魂P(guān)起先玩。4測(cè)試程序測(cè)試游戲,直到達(dá)到預(yù)期的效果。下圖為這個(gè)游戲運(yùn)行中的一個(gè)截圖:5本章小結(jié)關(guān)卡類游戲的結(jié)構(gòu)為:游戲基礎(chǔ)框
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 測(cè)量公司外業(yè)管理辦法
- 濟(jì)南員工關(guān)系管理辦法
- 濟(jì)南汽車租賃管理辦法
- 海南倉儲(chǔ)管理辦法細(xì)則
- 海南快遞閉環(huán)管理辦法
- 海南省員額制管理辦法
- 海口市天然氣管理辦法
- 海外業(yè)務(wù)理賠管理辦法
- 涂料生產(chǎn)現(xiàn)場(chǎng)管理辦法
- 深圳占位車位管理辦法
- 血液凈化護(hù)理知識(shí)競(jìng)賽考試題庫500題(含答案)
- 帶孩子免責(zé)協(xié)議書范本
- 守護(hù)生命之窗-氣管切開患者護(hù)理
- 信息技術(shù)咨詢服務(wù)合同5篇
- 2022年6月天津市普通高中學(xué)業(yè)水平合格性考試化學(xué)試卷
- 生豬購(gòu)銷合同協(xié)議
- 蘇教版六年級(jí)科學(xué)下冊(cè)期末測(cè)試卷及答案
- 人教版高中物理(必修一)同步講義+練習(xí)4.6 超重和失重(含解析)
- 血糖儀操作技術(shù)并發(fā)癥
- 2022年江蘇省常州市強(qiáng)基計(jì)劃選拔數(shù)學(xué)試卷(附答案解析)
- 三年級(jí)數(shù)學(xué)下冊(cè)計(jì)算題大全(每日一練共18份)
評(píng)論
0/150
提交評(píng)論