武思齊


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