袁飄逸
?
基于cocos2d-android的“植物大戰僵尸”游戲研發
袁飄逸
(云南師范大學 信息學院,云南 昆明 650000)
本文介紹了一款2D游戲軟件的研發過程。手機游戲利用cocos2d-android提供的場景、層、精靈和聲音引擎,游戲地圖繪圖結合Tiled制圖工具,快捷實現了游戲的開發與平臺部署。詳細闡述了該游戲的設計過程與游戲模塊功能的實現過程,為使用cocos2d-android迅速高效地實現開發者的游戲提供了一種思路。該游戲的重點在于對cocos2d-android這個游戲引擎的使用,以及游戲中點擊事件處理機制。
cocos2d-android;游戲引擎;地圖繪制;碰撞檢測
目前,隨著手游市場的不斷擴大,各型各態的手游APP應運而生,隨之涌現大量的開發工具和開發方法。如今游戲領域發展到了具有很強大的界面交互性、娛樂性、商業化的復雜游戲形態,但游戲要達到此效果,如果從頭編寫代碼,不依靠游戲引擎的使用,平均開發一款游戲的周期至少8個月以上,使用游戲引擎開發游戲能夠縮短一半的開發周期,還能節約開發成本和降低軟件風險。
本文介紹的是在Android平臺下使用cocos2d- android游戲引擎技術開發一款2D游戲,即把 cocos2d-android架構包移植到Android開發平臺上進行此游戲的研發與實現。
在開發過程中借鑒了“QQ農場”與“植物大戰僵尸”這兩款游戲的相關圖片以及聲音資源,僅為個人研發過程中使用,不作為商業用途。
Cocos2d是一個包含很多成員的大家族,其中含有Cocos2d-X、Cocos2d-iPhone、Cocos2d-JS等。然而,Cocos2d-X在中國處于世界領先水平。不同的Cocos2d版本之間的區別只是程序語言不同,但是實現的邏輯都相同。對于Cocos2d_Android只要關注以下四個部分:CCDirector(導演)、CCScene(場景)、CCLayer(圖層)、CCSprite(精靈)。
游戲的設計運用了cocos2d-android的CCGL-SurfaceView的主體功能實現,先建立一個場景,再在場景上添加圖層,隨后在圖層上添加精靈,最后由導演(CCDirector)指揮、運行。
本游戲事先會準備很多圖片(精靈),植物坐標以二維數組的存儲方式保存在特定集合中,僵尸坐標也保存于特定集合中,當游戲開始時,僵尸會從保存的坐標點中隨機產生出來;而植物的產生則由玩家安放。游戲的主體界面上有類似的植物安放位置地圖,是以屏幕位置劃分的,用戶只要單擊了植物,再點擊屏幕的設置范圍、即可做出相應的響應。
由于cocos2d-android游戲的特殊性,不能使用Android源生的默認界面,所以游戲地圖主界面采用Tiled工具制作特殊地圖的方式實現,游戲主要包括3個界面,游戲開始界面、游戲選擇界面、游戲主體界面。游戲的界面流程圖如圖1所示。所有非游戲界面采用了貼圖或者菜單選項等顯示機制,并對這些貼圖或者菜單設有按鈕點擊事件,當用戶點擊時,會有相應的提示。游戲主體界面是游戲設計中游戲對象最多,需要處理的游戲線程處理最復雜的界面[1]。
3.1.1 MENU(菜單)界面類
MENU(菜單)游戲菜單按鈕,首先使用CCSprite來初始化兩張背景圖片,一張是正常顯示的圖片,另一張是點擊按鈕按下去時的圖片;初始化菜單是使用CCMenu初始化的,其調用方式是用onClick( )方法來檢測菜單按鈕的狀態(菜單按鈕是否被選中),當被用戶點擊改菜單按鈕時,屏幕上會顯示按下去時的圖片,程序會調onSelect( )方法,這個方法中會有相應的點擊事件處理。

圖1 界面設計流程圖
3.1.2 游戲主界面類
游戲進入主界面是調用CCTMXTiledMap的tiledMap方法來加載Tiled地圖制作軟件制作的地圖,在加載地圖的同時,檢查存儲植物的集合是否為空,如果為空需轉至商店圖層購買植物,否則直接進入游戲;加載完地圖以后,再加載植物和僵尸的坐標點,這些坐標點存儲在特定的集合中;后續使用Random()方法隨機產生僵尸,使用一個cocos2d的定時器,即CCScheduler的scheduler方法,定時產生僵尸;左上方有供用戶操作的特殊工具,比如商店,倉庫等;右上方有返回按鈕。中上方位置是在商店購買的植物,不過這里只能顯示5種植物,即可安放的植物,在其下方就是戰斗位置、僵尸產生和植物安放的位置。
當提示安放植物時,一段延時以后,定時器會產生僵尸,隨后用戶可以種植植物,在這里為了方便判斷與減少未知的bug,用到了一個FightLine類(戰線類),該類的作用就是存儲某一條線上的植物對象和僵尸對象,用以處理游戲中碰撞的實現。如果僵尸遇到植物,則可攻擊;如果某一條線上有僵尸并且有可攻擊的植物時,則植物攻擊僵尸;如果該位置上有植物則不可安放其他植物。
3.1.3 地圖制作
一般cocos2d-android的地圖制作工具是Tiled地圖制作軟件,本游戲中使用到的功能有插入對象和插入對象層。主要目的是用于加載小僵尸的坐標點和植物種植的坐標點。
3.1.4 植物選擇框植物顯示位置的計算
游戲中用到的植物選擇框有3行4列,首先要確定某一個植物屬于哪一行哪一列;我們這樣計算:假設R(1<=R<=12)植物屬于第i行第j列,不妨設左上角的那個框為第0行第0列,在該位置的植物為1,如圖2所示。

圖2 植物選擇框
則:從0開始計數,
第1個植物,屬于0行0列,即:行:(1-1)/4列:(1-1)%4;
第2個植物,屬于0行1列,即:行:(2-1)/4列:(2-1)%4;
第3個植物,屬于0行2列,即:行:(3-1)/4列:(3-1)%4;
……
……
第12個植物,屬于2行3列,即:行:(12-1)/4列:(12-1)%4;
綜上;第R個植物,屬于i=(R-1)/4行、j=(R-1) %4列。
由于要在屏幕上顯示植物,故需知道其顯示的坐標;對于cocos2d游戲引擎,這里統一的設置其錨點為(0,0),因為游戲里植物圖片寬度為54像素,高度為59像素,每個框之間的距離為16像素,植物框的高度為175像素,所以某個植物的顯示位置如下:
=(R-1)%4*54+16;
=175-(R-1)/4*59;
隨后調用該植物的setPosition(x, y)方法即可在屏幕顯示,如圖3所示。

圖3 選擇框植物展示
3.1.5 植物可種植區域的計算
可種植區域就是戰斗的位置(包括植物和僵尸),游戲中的戰斗位置有3行4列,但屏幕總的有6行10列,首先要知道用戶點擊了哪行那列,由于每一行和每一列中每個格子的寬度為46像素,高度為53像素,不妨設用戶點擊的坐標為(x, y),對應的行為line、列為column,屏幕的高度為h,則:
行:line=/46;
列:column=(h-)/53;(cocos2d坐標體系原點為左下角)
從左往右、從上到下數起,可種植區域屬于從弟3行第6列開始至第5行第9列結束,如圖4 所示。

圖4 游戲地圖及植物種植區域
故可種植的行和列的范圍為:
行:line≥2 and line≤4;
列:column≥5 and column≤8;
即:當用戶點擊了的點在line和column范圍內,直接調用植物的setPosition(line, column)方法即可實現植物的種植。
3.2.1 可種植區域判斷
當用戶點擊了植物,再點擊屏幕其他位置時,先獲取到用戶點擊的位置坐標,如果用戶點擊的位置與可種植區域坐標相符時,并且該位置沒有其他植物時,方可種植植物,然后把所點擊植物的坐標設為所點擊的坐標。
3.2.2 植物種植過程的實現
首先,采用一個二維數組保存植物種植的坐標點,隨后在用一個類(戰線類)保存某一條線上的植物和僵尸,在生成戰斗頁面類時就初始化戰線類,如果有多條戰線,需循環初始化;該戰線類里面存有戰斗邏輯的相關方法,其中有個方法就是判斷該戰線中是否種植了植物,如果有則種植不成功,否則種植成功;當用戶點擊植物時,植物先變為半透明狀態,如果用戶種植了植物,隨后被點擊的植物恢復初始狀態,或者點擊其他植物也可以恢復初始狀態。在種植植物的過程中,程序會把種植了的植物對象和隨機產生的僵尸的對象添加到戰線類中,用于處理戰斗的碰撞過程。
3.2.3 太陽花的種植及生產陽光實現
首先,建了特定的基類,太陽花類繼承自生產植物基類,都有些特殊屬性,比如特殊的動畫;當安放了太陽花以后,會產生一個定時器,該定時器會定時的產生太陽花,太陽花產生的位置跟種植的太陽花有關,一般偏幅在10個像素左右;太陽花有其生命周期,當移動到收集的位置時,陽光值加加,然后陽光自身銷毀。其次,種植植物太陽花時,做了很多判斷,比如,是否落在了地圖可種植區域、該地圖位置是否已經種植了植物等。最后,如果太陽花被僵尸吃了,則會停止產生陽光的定時器來停止生產陽光同時太陽花植物本身銷毀。
3.2.4 豌豆射手種植及產生豌豆實現
豌豆射手和豌豆都繼承自植物基類,都有其特殊屬性,豌豆有其移動的屬性,從種植豌豆射手的位置,移動到某個位置,如果中途有僵尸則攻擊,否則不產生。豌豆也設有定時器,監測該位置的這條線上是否有僵尸,如果有則產生豌豆。豌豆射手種植和太陽花差不多,都是判斷是否落在可種植區域并且該位置沒有種植植物即可安放。
3.2.5 生成僵尸的實現
僵尸不同于植物,僵尸的產生需要幾個參數,移動的起始位置以及終點位置,以及移動過程中的不同動畫的播放。對于僵尸的基類,有些抽象方法可實現,比如是否被攻擊、是否攻擊植物、運動過程中播放的動畫等。僵尸的產生是隨機的,調用了Random()方法生成了幾個隨機數,用于讀取地圖的僵尸起點坐標點,然后在相應的某條線上產生僵尸。
3.2.6 游戲彈窗的實現
在實現游戲彈窗的時候,采用以下方式:首先,暫停當前圖層,調用當前圖層的父類,添加一個新的圖層,這個新的圖層就是彈窗。這個新的圖層也有點擊事件的操作,比如,結束這個新的圖層、繼續當前圖層。或者結束所有圖層。
在整個實現過程中,對游戲一些靜態常量的使用不熟,比如在使用完靜態常量以后,若不把靜態常量重置的話會出現未知的bug;還有就是對游 戲圖層的理解不熟悉,導致把精靈添加到圖層上沒有實現自己想要的結果;最后就是對點擊事件的處理機制理解不透徹,導致做彈窗圖層時導致程序崩潰。
[1] 蔣皓. 基于Android的游戲設計與開發[D]. 東南大學, 2011.
[2] 彭守鎮, 詹發榮. 基于Cocos2d-android的手機游戲開發[J]. 電腦知識與技術, 2014, 10(20): 4827-4828.
[3] 李婧. 基于Android平臺的手機游戲設計與實現[D]. 東南大學, 2017.
[4] 謝海軍. 基于JAVA的手機游戲引擎的研究及實現[D]. 西南交通大學, 2007.
[5] 陳法林, 許波. 基于SDL & Box2D的Android游戲引擎的設計與實現[J]. 現代計算機(專業版), 2018(12): 67-71.
[6] 黎忠文, 覃志東, 王全宇, 倪仲余. 基于Android平臺手機游戲引擎的設計與實現[J]. 計算機工程與設計, 2014, 35(01): 119-124.
[7] 李愛軍. 基于Cocos2d的迷宮游戲的設計與實現[J]. 辦公自動化, 2016, 21(13): 45-47+26.
[8] 孫紅麗, 葉斌. 基于Android的通訊錄系統的設計與實現[J]. 軟件, 2015, 36(5): 117-120.
[9] 汪文彬, 楊少輝. 基于短信控制的Android手機安全系統的設計與實現[J]. 軟件, 2015, 36(6): 21-25.
[10] 王志國, 楊維. 基于Android 平臺酒店人員定位系統的設計與實現[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的“植物大戰僵尸”游戲研發[J]. 軟件,2018,39(8):174-177