武思齊
摘 要 大白版泡泡堂游戲使用Visual C++和MFC開發(fā),游戲畫面精美,用戶體驗(yàn)良好,達(dá)到Q版泡泡堂的基本功能,并且在原有游戲界面上進(jìn)行一定改進(jìn)。但是“關(guān)于如何判斷玩家當(dāng)前是否應(yīng)該運(yùn)動(dòng)、當(dāng)前往哪個(gè)方向運(yùn)動(dòng)、當(dāng)前是已經(jīng)到達(dá)目標(biāo)單元格只需要修正到中間,還是尚未到達(dá)目標(biāo)單元格需要走到目標(biāo)單元格”的問題未解決。這篇文章針對存在的這些問題,進(jìn)行了分析,提出了通過設(shè)定多個(gè)標(biāo)記變量,像素推導(dǎo)所在單元格的方法的解決問題。最終實(shí)現(xiàn)了自動(dòng)生成地圖、武器數(shù)量限制、背景音樂、網(wǎng)格吸附、敵人尋找建筑安放炸彈、敵人遇見我方自動(dòng)安放炸彈,分?jǐn)?shù)自動(dòng)累加的功能。游戲推出后,用戶體驗(yàn)良好。
【關(guān)鍵詞】泡泡堂游戲 C++ MFC 炸彈游戲
1 背景
《泡泡堂》是由韓國游戲公司Nexon開發(fā)的一款休閑游戲。游戲講述了在哈巴森林的一個(gè)村落的村民們利用神奇的水泡來打獵和采集寶石,故事由為拯救村民和奪回被海盜搶去的寶石而展開。游戲畫面精美,功能友好,得到了很多人的歡迎和喜愛,并且風(fēng)靡一時(shí)。我們根據(jù)Q版泡泡堂為靈感,以《泡泡堂》為原型,以大白(Baymax)--迪士尼動(dòng)畫《超能陸戰(zhàn)隊(duì)》中的健康機(jī)器人為角色,設(shè)計(jì)開發(fā)一款大白版泡泡堂游戲,講述大白通過采集寶石攻擊敵人,摧毀邪惡勢力的故事。游戲更加生動(dòng)有趣,容易上手,可以滿足玩家的娛樂需求。
2 游戲需求
2.1 功能需求
(1)游戲需要設(shè)定游戲元素,擺闊建筑物、人物、地圖、炸彈均為自己構(gòu)造的類對象;
(2)游戲初始化:以一個(gè)二維vector存儲(chǔ)建筑物地圖并繪制,生成電腦玩家和用戶玩家角色的類對象;
(3)安置炸彈:在釋放處生成一個(gè)炸彈類對象并根據(jù)釋放者角色配置炸彈和顏色等;
(4)炸建筑、敵人:炸彈以所在位置為原點(diǎn),向上下左右搜索相應(yīng)的地圖方塊,根據(jù)地圖數(shù)組判斷攻擊范圍內(nèi)有無可炸元素,如有,摧毀之,自己的炸彈傷不到自己;
(5)電腦玩家移動(dòng):電腦玩家隨機(jī)選擇一個(gè)方向,在該方向前方無障礙的情況下朝該方向移動(dòng),遇障礙物則轉(zhuǎn)方向,若任意時(shí)刻四周有可炸的建筑物或者敵人,則自動(dòng)安放炸彈;
(6)分?jǐn)?shù)統(tǒng)計(jì):每個(gè)人物對象有數(shù)據(jù)成員記錄分?jǐn)?shù),炸開一個(gè)建筑物+10分,炸死敵人+1000分;
(7)死路規(guī)避:生成地圖時(shí),若人物被包圍在不可炸的建筑物中,則人物處于死路里。解決方案:生成人物時(shí),清空以人物為中心的九宮格內(nèi)的建筑。
2.2 存在難點(diǎn)及解決方式
在制作游戲的過程中,存在著以下六個(gè)較難實(shí)現(xiàn)的問題,針對這些問題提出了簡單的解決方法。
(1)屏幕上同時(shí)需要管理的對象實(shí)例很多,比如說有人,建筑物,炸彈等等,但是只要程序邏輯清晰,可以解決;
(2)對象間關(guān)系緊密復(fù)雜,如炸彈-建筑關(guān)系、建筑-人物關(guān)系,人物-人物關(guān)系,所以要設(shè)計(jì)好對象之間關(guān)聯(lián)方式;
(3)電腦用戶需要一定的智能以自己行動(dòng),需要簡化行動(dòng)規(guī)律,用簡單代碼寫出活動(dòng)的算法;
(4)敵我判斷,防止誤傷:可以炸彈記錄主人信息,若是主人則不摧毀;
(5)元素吸附網(wǎng)格、多鍵響應(yīng)問題:需要多個(gè)標(biāo)記變量解決問題,通過像素推導(dǎo)所在單元格;
(6)電腦玩家遇見我方知道襲擊:通過把我方當(dāng)做建筑來判斷來解決。
3 游戲設(shè)計(jì)及實(shí)現(xiàn)
3.1 游戲設(shè)計(jì)
游戲以Flash上 Q版泡泡堂為原型復(fù)刻一個(gè)BayMax版泡泡堂,開發(fā)環(huán)境使用Visual C++ 6.0,MFC工程;達(dá)到Q版泡泡堂的基本功能,包括安置炸彈、炸開建筑、炸死敵人、敵人自動(dòng)移動(dòng)等;大致復(fù)制Q版泡泡堂的功能:自動(dòng)生成地圖、武器數(shù)量限制、背景音樂、網(wǎng)格吸附、敵人尋找建筑安放炸彈、敵人遇見我方自動(dòng)安放炸彈,分?jǐn)?shù)自動(dòng)累加等功能。
3.2 游戲?qū)崿F(xiàn)
大白版泡泡堂要實(shí)現(xiàn)游戲角色在自動(dòng)生成的地圖中活動(dòng),玩家通過方向鍵控制角色上下左右移動(dòng),空格鍵釋放炸彈,炸彈沿上下左右方向釋放爆炸威力,以炸開一些建筑或者炸死敵人。下面介紹游戲主要部分的實(shí)現(xiàn)方法。
3.2.1 類及成員
游戲中設(shè)置Game、Player、Building、MapOfBuilding、Bomb類,類之間相互聯(lián)系、相互制約。
Game類中包括drawScore,getcomputerPlayerPointer,getPlayerPointer,theBomb等成員。
Player類中包括moveToNextUnit,getScore,getXpos,getYpos等成員。
MapOfBuilding類中包括drawMap,theVectorMap等成員。
3.2.2 運(yùn)行流程圖
如圖1所示。
3.2.3 重點(diǎn)類,函數(shù)實(shí)現(xiàn)
(1)View類OnDraw函數(shù)。為了使貼圖思路清晰,所有會(huì)改變畫面的操作都不立即重新貼圖,而是只改變類對象的屬性,當(dāng)Timer事件觸發(fā),OnDraw函數(shù)根據(jù)當(dāng)前所有存在的類對象的屬性值重繪整個(gè)畫面。這樣做可以使凡是與繪圖有關(guān)的代碼改變,只要改OnDraw函數(shù)里的內(nèi)容就行,不用到處找按鍵消息響應(yīng)的地方,思路清晰,易于維護(hù)。下面介紹函數(shù)的實(shí)現(xiàn)方法:
Draw Map:
if (玩家用戶存活|| 電腦用戶存活){
if (玩家的炸彈攻擊到電腦){
if (玩家用戶存活)-----顯示玩家勝利
else顯示玩家失敗
Draw Bomb:
如圖2所示。
(2)解決網(wǎng)格吸附的問題。游戲人物每次必定停在10*10的網(wǎng)格中某一個(gè)的正中間,這要求人物在一次按鍵響應(yīng)之后的每次Timer激發(fā)移動(dòng)一定像素,而在到達(dá)預(yù)定單元格中間位置時(shí)停止運(yùn)動(dòng)。所以,在Timer激發(fā)時(shí),如何判斷當(dāng)前是否應(yīng)該運(yùn)動(dòng)、當(dāng)前往哪個(gè)方向運(yùn)動(dòng)、當(dāng)前是已經(jīng)到達(dá)目標(biāo)單元格只需要修正到中間,還是尚未到達(dá)目標(biāo)單元格需要走到目標(biāo)單元格,就成了很重要的問題。我們可以通過Player類MoveToNextUnit函數(shù)解決網(wǎng)格吸附的問題,函數(shù)流程圖如圖3所示。
4 總結(jié)
泡泡堂游戲的風(fēng)靡全球不僅因?yàn)槠溆螒虺錆M故事性,畫面制作精良,還得力于游戲成熟的技術(shù)和易于操作的界面。我們開發(fā)的大白版泡泡堂借鑒了之中的優(yōu)點(diǎn),實(shí)現(xiàn)了Q版泡泡堂中的大部分功能,解決了諸如元素網(wǎng)格吸附,多鍵相應(yīng),電腦用戶智能運(yùn)動(dòng),以及地圖生成等難題,可以為其他愛好者拿來借鑒。但是在游戲界面的制作上,由于我們的繪圖能力不夠強(qiáng),在界面的制作上仍有許多改進(jìn)和完善的地方,我們會(huì)繼續(xù)改進(jìn)界面,完善功能。
參考文獻(xiàn)
[1]劉變蓮,劉東波.MFC與Windows程序[J].電腦知識與技術(shù),2015(32).
[2]朱全銀,章慧,孫文杰.基于J2ME及J2EE的移動(dòng)網(wǎng)絡(luò)游戲關(guān)鍵技術(shù)研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2008(20).
[3]趙麗娟,朱全銀.基于J2ME的移動(dòng)網(wǎng)絡(luò)游戲設(shè)計(jì)與實(shí)現(xiàn)[J].網(wǎng)絡(luò)與通信技術(shù),2010(12).
[4]馬棟,邱燁.泡泡堂游戲開發(fā)技術(shù)淺析[J].硅谷,Silicon Valley,2009(20).
作者單位
四川大學(xué)計(jì)算機(jī)學(xué)院 四川省成都市 610225