李愛軍
(蘇州職業大學計算機工程學院 蘇州 215104)
基于Cocos2d的迷宮游戲的設計與實現
李愛軍
(蘇州職業大學計算機工程學院蘇州215104)
本游戲用Xcode開發,并基于Cocos2d,開發過程中運用了流程控制、菜單、特效、精靈等技術開發。蘋果游戲開發模式雖然說看似封閉,但是從另一方面卻極大地激起開發者興趣。
迷宮手機游戲Cocos2d-X
迷宮游戲設計目的是訓練人的思維能力,為了解決玩家在等公交車,放松休息,在咖啡廳等悠閑時間無聊的問題,既不占用工作時間,又可以給玩家帶來樂趣。游戲更是設計了眾多關卡,隨著關卡的增加,游戲難度會逐漸增加,讓玩家可以盡情享受游戲的樂趣。
本游戲設計是單機類迷宮闖關小游戲,相比于電腦版的闖關類迷宮類小游戲,在操作方面更加的簡潔方便,畫面更加的明了。為了保證游戲的流暢性,游戲在計算步驟方面運用了不算太過于冗長的代碼,但同時有保證了游戲的樂趣性。在整個游戲中,實現以下功能。
1、進入游戲界面,出現游戲介紹和游戲開始的選項;
2、游戲進行時,可以選擇返回選項;
3、當迷宮人物路線選擇錯誤,人物可以自動回到起點;
4、玩家可以隨意游戲的關卡,不會被限制于固定關卡;
5、游戲關卡的排列,確保排列格式為蛇形排列;
6、腳印圖形的嵌入,當人物進入出口時,界面自動跳轉為游戲的關卡選擇界面;
7、設計每張圖形的路線,從第一關開始逐漸加大游戲的難度;
8、當游戲進入或者退出關卡時,切換界面的方式的選擇為切入;
9、當人物選擇路線的方向固定時,游戲自動控制人物走到方向選擇路口,優化游戲操作。
如圖1。
主視圖初始化模塊:創建并添加游戲視圖,添加游戲關卡的選擇視圖,通關關卡視圖,返回界面選擇視圖。
迷宮初始化模塊:清空人物相應位置的信息,將地圖上面的人物位置移動到初始化位置。
迷宮關卡選擇模塊;選擇游戲的關卡,一共40關迷宮,玩家可以自由選擇迷宮的關卡,突顯游戲的高度自由。
游戲介紹模塊:游戲開始時,玩家可以通過游戲簡介加快對游戲的了解,以便玩家可以盡快的上手游戲。
判斷游戲通過模塊:玩家通過自己的計算步驟,并且走入終點,該模塊通過判斷玩家控制的人物是否到達終點來決定是否通過關卡。
返回關卡選擇模塊:當玩家未通過此關卡時,玩家可以選擇返回,返回到游戲關卡選擇界面,重新選擇游戲其他關卡進行游戲。
A*(A-Star)算法是一種靜態路網中求解最短路徑最有效的直接搜索方法。估價值與實際值越接近,估價函數取得就越好。例如對于幾何路網來說,可以取兩節點間歐幾理德距離(直線距離)做為估價值,即:f=g(n)+sqrt((dx-nx)*(dx-nx)+(dy-ny)*(dy-ny));這樣估價函數f在g值一定的情況下,會或多或少的受估價值h的制約,節點距目標點近,h值小,f值相對就小,能保證最短路的搜索向終點的方向進行。
通過使用A*算法實現將人物移動到指定的位置,如果路徑不存在,則無法移動。因為這里A*尋路算法是有個概念的,就是有個路徑最短的計算方法:f=g+h,簡單的講就是這個節點到達目的節點的距離f等于這個節點周圍的一個節點到達這個節點的距離g值再加上周圍節點到達目的節點的距離h值。
尋路的第一步是簡化成容易控制的搜索區域。怎么處理要根據游戲來決定了。例如,我們可以將搜索區域劃分成像素點,但是這樣的劃分粒度對于我們這款基于方塊的游戲來說太高了。作為代替,我們使用方塊(一個正方形)作為尋路算法的單元。其他的形狀類型也是可能的(比如三角形或者六邊形),但是正方形是最簡單并且最適合我們需求的。
像那樣去劃分,我們的搜索區域可以簡單的用一個地圖大小的二維數組去表示。所以如果是25*25方塊大小的地圖,我們的搜索區域將會是一個有625個正方形的數組。如果我們把地圖劃分成像素點,搜索區域就是一個有640,000個正方形的數組了(一個方塊是32*32像素)。我們將會給每個方塊一個G+H和值。G是從開始點A到當前方塊的移動量。所以從開始點A到相鄰小方塊的移動量為1,該值會隨著離開始點越來越遠而增大。H是從當前方塊到目標點(我們把它稱為點B,代表骨頭!)的移動量估算值。這個常被稱為探視,因為我們不確定移動量是多少-僅僅是一個估算值。
G是從開始點A到達當前方塊的移動量。為了計算出G的值,我們需要從它的前繼(上一個方塊)獲取,然后加1。所以,每個方塊的G值代表了從點A到該方塊所形成路徑的總移動量。
H值是從當前方塊到終點的移動量估算值(在本游戲中是指方塊的數目)。移動量估算值離真實值越接近,最終的路徑會更加精確。如果估算值停止作用,很可能生成出來的路徑不會是最短的(但是它可能是接近的)。為了讓它更簡單,我們將使用“曼哈頓距離方法”(也叫“曼哈頓長”或者“城市街區距離”),它只是計算出距離點B,剩下的水平和垂直的方塊數量,略去了障礙物或者不同陸地類型的數量。
方法會返回一個數組,里面包含了地圖周圍的四個節點對象。依次取出地圖四周的節點對象,因為是通過點擊地圖后地圖和人才移動的,但是需要檢查地圖四個方向上是否有人,移動的方向即人面向的方向,如果有則判斷哪個節點對象的位置是人物按鈕。
-(void)moveNext:(NSButtonNode*)nextNode currentNode:(NSButtonNode*)currentNode
UIButton*oneButton=currentNode.mapButton;UIButton*nextButton=nextNode.button;
第一行意思把當前節點NSButtonNode對象的屬性上層按鈕賦給一個按鈕引用對象。第二行把下一個NSButtonN-ode對象節點的屬性下層按鈕也賦給一個按鈕引用對象。來判斷這兩個按鈕是否是存在的。
假如當前節點的上層按鈕屬性值是存在的而且下一個節點的下層按鈕屬性值也是存在的,則可以進行兩個節點的按鈕屬性值交換的操作以實現按鈕移動的效果。下一個按鈕的 frame值賦值給當前節點對象的上層按鈕的frame屬性是為了使得將oneButton移動到nextButton的位置時使其位置和大小保持一致。nextButton的tag值也賦給oneB-utton是因為tag值標識了按鈕所在的位置,可以通過獲取按鈕的tag值來判斷按鈕的位置在第幾行第幾列,根據這個行列值就可以到NSButtonNode節點對象數組中獲取擁有這個按鈕的NSButtonNode對象,因為按鈕的位置發生變化了所以我們也要更新它的tag值使其與新位置保存一致。設置這個按鈕在當前父視圖上前置顯示。
將當前節點的當前狀態值復制另存是為了賦給下一個節點的當前狀態值屬性,因為這個狀態值標識了一個節點對象它所控制的位置給人看到的按鈕是何種類型的。地圖按鈕或者是人物按鈕移動位置后就不在當前節點上面了,所以要它的屬性mapButton賦值為空。由于當前節點對象的mapButton按鈕屬性值已為空,那么當前節點對象所控制位置顯示的按鈕是它的屬性button值,也就是就一層按鈕了,所以這個節點對象用來標識當前顯示的是何種類型的按鈕的屬性currentState值,要恢復成它之前的狀態值,而這個狀態值就保存在它的屬性lastState中。由于節點原來的狀態還原了,所以將屬性lastState值賦值為一開始初始化時的枚舉值NOSTATE。
把這個引用上一個節點的用于顯示在上層的按鈕對象賦給下一個節點的用于顯示的上層按鈕屬性。因為下一個節點對象所控制位置顯示的按鈕發生變化,所以要將它自己原來的狀態值保存在屬性lastState中,以便人物或者是地圖移走后,還能夠恢復成原來的狀態。因為這個節點對象所控制位置顯示在視圖上的按鈕發生了變化,所以它相應標識的屬性currentState也要設置成對應的屬性值。
第一個if是指,如果測試節點的周圍的這個節點對象已經在openAry數組中了,就判斷在這個測試節點的基礎上再前進一步到這個屬于周圍節點中的這個節點的g值是否比它原來算的g值是否要小,如果要小則表示原來要走的節點通過這個測試節點走過去g值更小,距離更加的短,由于已經在開發數組中的節點的g值發生了改變則需要建造堆,也就是對開放數組中的節點進行針對g值的重新排序,使得首節點是g值最小的節點
設置父節點的目的是為了在尋找的測試的節點就是目標節點后通過目標節點的父節點可以進行遞歸到開始的人的節點,這樣做的目的是為了將從人的位置通向目標節點的路徑,也就是順序排列的節點都找出來,在通過倒序后的路徑就可以走到目標節點位置的路徑了。
節點發生了變化,需要重新按照f值給openAry數組的節點對象進行最小二叉堆的排序如果這個周圍的節點對象不在openAry數組里面,就把它加入到openAry數組中,如果此時openAry數組中元素個數是三個或者是三個以上,則進行按照節點對象的屬性f值最小二叉堆的排序。也就是使得openAry數組中的首元素的f值是最小的,最小的f值節點對象優先作為最短路徑構成選擇。
游戲本身是一款可以在iPad運行的迷宮類闖關類小游戲,在游戲打開后直接進入游戲主界面,用戶這時可以兩個選項:進入進一步的關卡選擇或者看游戲簡介。當玩家選擇關卡時玩家進入選定關卡,繼而指揮角色從起點穿過層層障礙到達出口。玩家在這個過程也可以進行游戲的退出,進而可以選擇新的關卡,開始新一輪的游戲。
本文在詳細論述了基于Cocos2d的迷宮類闖關類小游戲,介紹了系統的主要模塊和算法分析以及算法關鍵代碼實現,最后對該游戲平臺進行了試運行。此系統具有一定的實用性和應用前景。
[1][美]Rob Napier.Mugunth Kumar,庫 瑪.iOS編程實戰[M].人民郵電出版社,2014.
[2][美]赫樂嘎斯,康威.iOS編程(第4版)[M].華中科技大學出版社,2015.
[3]劉劍卓.Cocos2D-X游戲開發技術精解[M].人民郵電出版社,2013.
李愛軍(1973~),男,碩士,講師,研究方向為面向程序對象設計、數據庫技術、IOS開發技術。
Design and Implementation of Maze Game Based on Cocos2d
Li Aijun
(Computers Engineering Institute,Suzhou Vocational UniversitySuzhou215004)
The game with Xcode development,and based on Cocos2d,the process of developing the use of process control,menu,special effects,elves and other technology development.Apple game development model that seems to be closed,but on the other hand is greatly aroused the interest of developers.The design of the original intention of this game is to solve peoplesent in the boring time,exercise the brain,so as to let the game player to find the joy of the game of the.
MazeMobile phone gameCocos2d-X
TP311
A
160607-7303