袁飄逸
?
基于cocos2d-android的“植物大戰(zhàn)僵尸”游戲研發(fā)
袁飄逸
(云南師范大學(xué) 信息學(xué)院,云南 昆明 650000)
本文介紹了一款2D游戲軟件的研發(fā)過程。手機(jī)游戲利用cocos2d-android提供的場(chǎng)景、層、精靈和聲音引擎,游戲地圖繪圖結(jié)合Tiled制圖工具,快捷實(shí)現(xiàn)了游戲的開發(fā)與平臺(tái)部署。詳細(xì)闡述了該游戲的設(shè)計(jì)過程與游戲模塊功能的實(shí)現(xiàn)過程,為使用cocos2d-android迅速高效地實(shí)現(xiàn)開發(fā)者的游戲提供了一種思路。該游戲的重點(diǎn)在于對(duì)cocos2d-android這個(gè)游戲引擎的使用,以及游戲中點(diǎn)擊事件處理機(jī)制。
cocos2d-android;游戲引擎;地圖繪制;碰撞檢測(cè)
目前,隨著手游市場(chǎng)的不斷擴(kuò)大,各型各態(tài)的手游APP應(yīng)運(yùn)而生,隨之涌現(xiàn)大量的開發(fā)工具和開發(fā)方法。如今游戲領(lǐng)域發(fā)展到了具有很強(qiáng)大的界面交互性、娛樂性、商業(yè)化的復(fù)雜游戲形態(tài),但游戲要達(dá)到此效果,如果從頭編寫代碼,不依靠游戲引擎的使用,平均開發(fā)一款游戲的周期至少8個(gè)月以上,使用游戲引擎開發(fā)游戲能夠縮短一半的開發(fā)周期,還能節(jié)約開發(fā)成本和降低軟件風(fēng)險(xiǎn)。
本文介紹的是在Android平臺(tái)下使用cocos2d- android游戲引擎技術(shù)開發(fā)一款2D游戲,即把 cocos2d-android架構(gòu)包移植到Android開發(fā)平臺(tái)上進(jìn)行此游戲的研發(fā)與實(shí)現(xiàn)。
在開發(fā)過程中借鑒了“QQ農(nóng)場(chǎng)”與“植物大戰(zhàn)僵尸”這兩款游戲的相關(guān)圖片以及聲音資源,僅為個(gè)人研發(fā)過程中使用,不作為商業(yè)用途。
Cocos2d是一個(gè)包含很多成員的大家族,其中含有Cocos2d-X、Cocos2d-iPhone、Cocos2d-JS等。然而,Cocos2d-X在中國處于世界領(lǐng)先水平。不同的Cocos2d版本之間的區(qū)別只是程序語言不同,但是實(shí)現(xiàn)的邏輯都相同。對(duì)于Cocos2d_Android只要關(guān)注以下四個(gè)部分:CCDirector(導(dǎo)演)、CCScene(場(chǎng)景)、CCLayer(圖層)、CCSprite(精靈)。
游戲的設(shè)計(jì)運(yùn)用了cocos2d-android的CCGL-SurfaceView的主體功能實(shí)現(xiàn),先建立一個(gè)場(chǎng)景,再在場(chǎng)景上添加圖層,隨后在圖層上添加精靈,最后由導(dǎo)演(CCDirector)指揮、運(yùn)行。
本游戲事先會(huì)準(zhǔn)備很多圖片(精靈),植物坐標(biāo)以二維數(shù)組的存儲(chǔ)方式保存在特定集合中,僵尸坐標(biāo)也保存于特定集合中,當(dāng)游戲開始時(shí),僵尸會(huì)從保存的坐標(biāo)點(diǎn)中隨機(jī)產(chǎn)生出來;而植物的產(chǎn)生則由玩家安放。游戲的主體界面上有類似的植物安放位置地圖,是以屏幕位置劃分的,用戶只要單擊了植物,再點(diǎn)擊屏幕的設(shè)置范圍、即可做出相應(yīng)的響應(yīng)。
由于cocos2d-android游戲的特殊性,不能使用Android源生的默認(rèn)界面,所以游戲地圖主界面采用Tiled工具制作特殊地圖的方式實(shí)現(xiàn),游戲主要包括3個(gè)界面,游戲開始界面、游戲選擇界面、游戲主體界面。游戲的界面流程圖如圖1所示。所有非游戲界面采用了貼圖或者菜單選項(xiàng)等顯示機(jī)制,并對(duì)這些貼圖或者菜單設(shè)有按鈕點(diǎn)擊事件,當(dāng)用戶點(diǎn)擊時(shí),會(huì)有相應(yīng)的提示。游戲主體界面是游戲設(shè)計(jì)中游戲?qū)ο笞疃?,需要處理的游戲線程處理最復(fù)雜的界面[1]。
3.1.1 MENU(菜單)界面類
MENU(菜單)游戲菜單按鈕,首先使用CCSprite來初始化兩張背景圖片,一張是正常顯示的圖片,另一張是點(diǎn)擊按鈕按下去時(shí)的圖片;初始化菜單是使用CCMenu初始化的,其調(diào)用方式是用onClick( )方法來檢測(cè)菜單按鈕的狀態(tài)(菜單按鈕是否被選中),當(dāng)被用戶點(diǎn)擊改菜單按鈕時(shí),屏幕上會(huì)顯示按下去時(shí)的圖片,程序會(huì)調(diào)onSelect( )方法,這個(gè)方法中會(huì)有相應(yīng)的點(diǎn)擊事件處理。
圖1 界面設(shè)計(jì)流程圖
3.1.2 游戲主界面類
游戲進(jìn)入主界面是調(diào)用CCTMXTiledMap的tiledMap方法來加載Tiled地圖制作軟件制作的地圖,在加載地圖的同時(shí),檢查存儲(chǔ)植物的集合是否為空,如果為空需轉(zhuǎn)至商店圖層購買植物,否則直接進(jìn)入游戲;加載完地圖以后,再加載植物和僵尸的坐標(biāo)點(diǎn),這些坐標(biāo)點(diǎn)存儲(chǔ)在特定的集合中;后續(xù)使用Random()方法隨機(jī)產(chǎn)生僵尸,使用一個(gè)cocos2d的定時(shí)器,即CCScheduler的scheduler方法,定時(shí)產(chǎn)生僵尸;左上方有供用戶操作的特殊工具,比如商店,倉庫等;右上方有返回按鈕。中上方位置是在商店購買的植物,不過這里只能顯示5種植物,即可安放的植物,在其下方就是戰(zhàn)斗位置、僵尸產(chǎn)生和植物安放的位置。
當(dāng)提示安放植物時(shí),一段延時(shí)以后,定時(shí)器會(huì)產(chǎn)生僵尸,隨后用戶可以種植植物,在這里為了方便判斷與減少未知的bug,用到了一個(gè)FightLine類(戰(zhàn)線類),該類的作用就是存儲(chǔ)某一條線上的植物對(duì)象和僵尸對(duì)象,用以處理游戲中碰撞的實(shí)現(xiàn)。如果僵尸遇到植物,則可攻擊;如果某一條線上有僵尸并且有可攻擊的植物時(shí),則植物攻擊僵尸;如果該位置上有植物則不可安放其他植物。
3.1.3 地圖制作
一般cocos2d-android的地圖制作工具是Tiled地圖制作軟件,本游戲中使用到的功能有插入對(duì)象和插入對(duì)象層。主要目的是用于加載小僵尸的坐標(biāo)點(diǎn)和植物種植的坐標(biāo)點(diǎn)。
3.1.4 植物選擇框植物顯示位置的計(jì)算
游戲中用到的植物選擇框有3行4列,首先要確定某一個(gè)植物屬于哪一行哪一列;我們這樣計(jì)算:假設(shè)R(1<=R<=12)植物屬于第i行第j列,不妨設(shè)左上角的那個(gè)框?yàn)榈?行第0列,在該位置的植物為1,如圖2所示。
圖2 植物選擇框
則:從0開始計(jì)數(shù),
第1個(gè)植物,屬于0行0列,即:行:(1-1)/4列:(1-1)%4;
第2個(gè)植物,屬于0行1列,即:行:(2-1)/4列:(2-1)%4;
第3個(gè)植物,屬于0行2列,即:行:(3-1)/4列:(3-1)%4;
……
……
第12個(gè)植物,屬于2行3列,即:行:(12-1)/4列:(12-1)%4;
綜上;第R個(gè)植物,屬于i=(R-1)/4行、j=(R-1) %4列。
由于要在屏幕上顯示植物,故需知道其顯示的坐標(biāo);對(duì)于cocos2d游戲引擎,這里統(tǒng)一的設(shè)置其錨點(diǎn)為(0,0),因?yàn)橛螒蚶镏参飯D片寬度為54像素,高度為59像素,每個(gè)框之間的距離為16像素,植物框的高度為175像素,所以某個(gè)植物的顯示位置如下:
=(R-1)%4*54+16;
=175-(R-1)/4*59;
隨后調(diào)用該植物的setPosition(x, y)方法即可在屏幕顯示,如圖3所示。
圖3 選擇框植物展示
3.1.5 植物可種植區(qū)域的計(jì)算
可種植區(qū)域就是戰(zhàn)斗的位置(包括植物和僵尸),游戲中的戰(zhàn)斗位置有3行4列,但屏幕總的有6行10列,首先要知道用戶點(diǎn)擊了哪行那列,由于每一行和每一列中每個(gè)格子的寬度為46像素,高度為53像素,不妨設(shè)用戶點(diǎn)擊的坐標(biāo)為(x, y),對(duì)應(yīng)的行為line、列為column,屏幕的高度為h,則:
行:line=/46;
列:column=(h-)/53;(cocos2d坐標(biāo)體系原點(diǎn)為左下角)
從左往右、從上到下數(shù)起,可種植區(qū)域?qū)儆趶牡?行第6列開始至第5行第9列結(jié)束,如圖4 所示。
圖4 游戲地圖及植物種植區(qū)域
故可種植的行和列的范圍為:
行:line≥2 and line≤4;
列:column≥5 and column≤8;
即:當(dāng)用戶點(diǎn)擊了的點(diǎn)在line和column范圍內(nèi),直接調(diào)用植物的setPosition(line, column)方法即可實(shí)現(xiàn)植物的種植。
3.2.1 可種植區(qū)域判斷
當(dāng)用戶點(diǎn)擊了植物,再點(diǎn)擊屏幕其他位置時(shí),先獲取到用戶點(diǎn)擊的位置坐標(biāo),如果用戶點(diǎn)擊的位置與可種植區(qū)域坐標(biāo)相符時(shí),并且該位置沒有其他植物時(shí),方可種植植物,然后把所點(diǎn)擊植物的坐標(biāo)設(shè)為所點(diǎn)擊的坐標(biāo)。
3.2.2 植物種植過程的實(shí)現(xiàn)
首先,采用一個(gè)二維數(shù)組保存植物種植的坐標(biāo)點(diǎn),隨后在用一個(gè)類(戰(zhàn)線類)保存某一條線上的植物和僵尸,在生成戰(zhàn)斗頁面類時(shí)就初始化戰(zhàn)線類,如果有多條戰(zhàn)線,需循環(huán)初始化;該戰(zhàn)線類里面存有戰(zhàn)斗邏輯的相關(guān)方法,其中有個(gè)方法就是判斷該戰(zhàn)線中是否種植了植物,如果有則種植不成功,否則種植成功;當(dāng)用戶點(diǎn)擊植物時(shí),植物先變?yōu)榘胪该鳡顟B(tài),如果用戶種植了植物,隨后被點(diǎn)擊的植物恢復(fù)初始狀態(tài),或者點(diǎn)擊其他植物也可以恢復(fù)初始狀態(tài)。在種植植物的過程中,程序會(huì)把種植了的植物對(duì)象和隨機(jī)產(chǎn)生的僵尸的對(duì)象添加到戰(zhàn)線類中,用于處理戰(zhàn)斗的碰撞過程。
3.2.3 太陽花的種植及生產(chǎn)陽光實(shí)現(xiàn)
首先,建了特定的基類,太陽花類繼承自生產(chǎn)植物基類,都有些特殊屬性,比如特殊的動(dòng)畫;當(dāng)安放了太陽花以后,會(huì)產(chǎn)生一個(gè)定時(shí)器,該定時(shí)器會(huì)定時(shí)的產(chǎn)生太陽花,太陽花產(chǎn)生的位置跟種植的太陽花有關(guān),一般偏幅在10個(gè)像素左右;太陽花有其生命周期,當(dāng)移動(dòng)到收集的位置時(shí),陽光值加加,然后陽光自身銷毀。其次,種植植物太陽花時(shí),做了很多判斷,比如,是否落在了地圖可種植區(qū)域、該地圖位置是否已經(jīng)種植了植物等。最后,如果太陽花被僵尸吃了,則會(huì)停止產(chǎn)生陽光的定時(shí)器來停止生產(chǎn)陽光同時(shí)太陽花植物本身銷毀。
3.2.4 豌豆射手種植及產(chǎn)生豌豆實(shí)現(xiàn)
豌豆射手和豌豆都繼承自植物基類,都有其特殊屬性,豌豆有其移動(dòng)的屬性,從種植豌豆射手的位置,移動(dòng)到某個(gè)位置,如果中途有僵尸則攻擊,否則不產(chǎn)生。豌豆也設(shè)有定時(shí)器,監(jiān)測(cè)該位置的這條線上是否有僵尸,如果有則產(chǎn)生豌豆。豌豆射手種植和太陽花差不多,都是判斷是否落在可種植區(qū)域并且該位置沒有種植植物即可安放。
3.2.5 生成僵尸的實(shí)現(xiàn)
僵尸不同于植物,僵尸的產(chǎn)生需要幾個(gè)參數(shù),移動(dòng)的起始位置以及終點(diǎn)位置,以及移動(dòng)過程中的不同動(dòng)畫的播放。對(duì)于僵尸的基類,有些抽象方法可實(shí)現(xiàn),比如是否被攻擊、是否攻擊植物、運(yùn)動(dòng)過程中播放的動(dòng)畫等。僵尸的產(chǎn)生是隨機(jī)的,調(diào)用了Random()方法生成了幾個(gè)隨機(jī)數(shù),用于讀取地圖的僵尸起點(diǎn)坐標(biāo)點(diǎn),然后在相應(yīng)的某條線上產(chǎn)生僵尸。
3.2.6 游戲彈窗的實(shí)現(xiàn)
在實(shí)現(xiàn)游戲彈窗的時(shí)候,采用以下方式:首先,暫停當(dāng)前圖層,調(diào)用當(dāng)前圖層的父類,添加一個(gè)新的圖層,這個(gè)新的圖層就是彈窗。這個(gè)新的圖層也有點(diǎn)擊事件的操作,比如,結(jié)束這個(gè)新的圖層、繼續(xù)當(dāng)前圖層?;蛘呓Y(jié)束所有圖層。
在整個(gè)實(shí)現(xiàn)過程中,對(duì)游戲一些靜態(tài)常量的使用不熟,比如在使用完靜態(tài)常量以后,若不把靜態(tài)常量重置的話會(huì)出現(xiàn)未知的bug;還有就是對(duì)游 戲圖層的理解不熟悉,導(dǎo)致把精靈添加到圖層上沒有實(shí)現(xiàn)自己想要的結(jié)果;最后就是對(duì)點(diǎn)擊事件的處理機(jī)制理解不透徹,導(dǎo)致做彈窗圖層時(shí)導(dǎo)致程序崩潰。
[1] 蔣皓. 基于Android的游戲設(shè)計(jì)與開發(fā)[D]. 東南大學(xué), 2011.
[2] 彭守鎮(zhèn), 詹發(fā)榮. 基于Cocos2d-android的手機(jī)游戲開發(fā)[J]. 電腦知識(shí)與技術(shù), 2014, 10(20): 4827-4828.
[3] 李婧. 基于Android平臺(tái)的手機(jī)游戲設(shè)計(jì)與實(shí)現(xiàn)[D]. 東南大學(xué), 2017.
[4] 謝海軍. 基于JAVA的手機(jī)游戲引擎的研究及實(shí)現(xiàn)[D]. 西南交通大學(xué), 2007.
[5] 陳法林, 許波. 基于SDL & Box2D的Android游戲引擎的設(shè)計(jì)與實(shí)現(xiàn)[J]. 現(xiàn)代計(jì)算機(jī)(專業(yè)版), 2018(12): 67-71.
[6] 黎忠文, 覃志東, 王全宇, 倪仲余. 基于Android平臺(tái)手機(jī)游戲引擎的設(shè)計(jì)與實(shí)現(xiàn)[J]. 計(jì)算機(jī)工程與設(shè)計(jì), 2014, 35(01): 119-124.
[7] 李愛軍. 基于Cocos2d的迷宮游戲的設(shè)計(jì)與實(shí)現(xiàn)[J]. 辦公自動(dòng)化, 2016, 21(13): 45-47+26.
[8] 孫紅麗, 葉斌. 基于Android的通訊錄系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 軟件, 2015, 36(5): 117-120.
[9] 汪文彬, 楊少輝. 基于短信控制的Android手機(jī)安全系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 軟件, 2015, 36(6): 21-25.
[10] 王志國, 楊維. 基于Android 平臺(tái)酒店人員定位系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 軟件, 2015, 36(10): 65-67.
The Development of "Plant vs Zombies" Game Based on Cocos2d-android
YUAN Piao-yi
(School of Information Science and Technology, Yunnan Normal University, Kunming 650000)
This article describes the development process of a 2D game software. Mobile games use scenes, layers, sprites, and sound engines provided by cocos2d-android, game maps, and Tiled mapping tools to quickly implement game development and platform deployment. The process of designing the game and the realization of the module function of the game are described in detail, which provides a way of thinking for using the cocos2d-android to quickly and efficiently implement the developer's game. The game's focus is on the use of the cocos2d-android game engine, as well as the click event handling mechanism in the game.
Cocos2d-android; Game engine; Map drawing; Collision detection
TP311.52
A
10.3969/j.issn.1003-6970.2018.08.035
袁飄逸(1996-),女,研究生,主要研究方向:安卓游戲引擎。
本文著錄格式:袁飄逸. 基于cocos2d-android的“植物大戰(zhàn)僵尸”游戲研發(fā)[J]. 軟件,2018,39(8):174-177