基于cocos2d-android的“植物大战僵尸”游戏研发

2018-09-14 08:06袁飘逸
软件 2018年8期
关键词:僵尸图层引擎

袁飘逸



基于cocos2d-android的“植物大战僵尸”游戏研发

袁飘逸

(云南师范大学 信息学院,云南 昆明 650000)

本文介绍了一款2D游戏软件的研发过程。手机游戏利用cocos2d-android提供的场景、层、精灵和声音引擎,游戏地图绘图结合Tiled制图工具,快捷实现了游戏的开发与平台部署。详细阐述了该游戏的设计过程与游戏模块功能的实现过程,为使用cocos2d-android迅速高效地实现开发者的游戏提供了一种思路。该游戏的重点在于对cocos2d-android这个游戏引擎的使用,以及游戏中点击事件处理机制。

cocos2d-android;游戏引擎;地图绘制;碰撞检测

0 引言

目前,随着手游市场的不断扩大,各型各态的手游APP应运而生,随之涌现大量的开发工具和开发方法。如今游戏领域发展到了具有很强大的界面交互性、娱乐性、商业化的复杂游戏形态,但游戏要达到此效果,如果从头编写代码,不依靠游戏引擎的使用,平均开发一款游戏的周期至少8个月以上,使用游戏引擎开发游戏能够缩短一半的开发周期,还能节约开发成本和降低软件风险。

本文介绍的是在Android平台下使用cocos2d- android游戏引擎技术开发一款2D游戏,即把 cocos2d-android架构包移植到Android开发平台上进行此游戏的研发与实现。

在开发过程中借鉴了“QQ农场”与“植物大战僵尸”这两款游戏的相关图片以及声音资源,仅为个人研发过程中使用,不作为商业用途。

1 Cocos2d_android游戏引擎介绍

Cocos2d是一个包含很多成员的大家族,其中含有Cocos2d-X、Cocos2d-iPhone、Cocos2d-JS等。然而,Cocos2d-X在中国处于世界领先水平。不同的Cocos2d版本之间的区别只是程序语言不同,但是实现的逻辑都相同。对于Cocos2d_Android只要关注以下四个部分:CCDirector(导演)、CCScene(场景)、CCLayer(图层)、CCSprite(精灵)。

2 总体设计

游戏的设计运用了cocos2d-android的CCGL­SurfaceView的主体功能实现,先建立一个场景,再在场景上添加图层,随后在图层上添加精灵,最后由导演(CCDirector)指挥、运行。

本游戏事先会准备很多图片(精灵),植物坐标以二维数组的存储方式保存在特定集合中,僵尸坐标也保存于特定集合中,当游戏开始时,僵尸会从保存的坐标点中随机产生出来;而植物的产生则由玩家安放。游戏的主体界面上有类似的植物安放位置地图,是以屏幕位置划分的,用户只要单击了植物,再点击屏幕的设置范围、即可做出相应的响应。

由于cocos2d-android游戏的特殊性,不能使用Android源生的默认界面,所以游戏地图主界面采用Tiled工具制作特殊地图的方式实现,游戏主要包括3个界面,游戏开始界面、游戏选择界面、游戏主体界面。游戏的界面流程图如图1所示。所有非游戏界面采用了贴图或者菜单选项等显示机制,并对这些贴图或者菜单设有按钮点击事件,当用户点击时,会有相应的提示。游戏主体界面是游戏设计中游戏对象最多,需要处理的游戏线程处理最复杂的界面[1]。

3 业务逻辑的实现

3.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 单项功能的实现

3.2.1 可种植区域判断

当用户点击了植物,再点击屏幕其他位置时,先获取到用户点击的位置坐标,如果用户点击的位置与可种植区域坐标相符时,并且该位置没有其他植物时,方可种植植物,然后把所点击植物的坐标设为所点击的坐标。

3.2.2 植物种植过程的实现

首先,采用一个二维数组保存植物种植的坐标点,随后在用一个类(战线类)保存某一条线上的植物和僵尸,在生成战斗页面类时就初始化战线类,如果有多条战线,需循环初始化;该战线类里面存有战斗逻辑的相关方法,其中有个方法就是判断该战线中是否种植了植物,如果有则种植不成功,否则种植成功;当用户点击植物时,植物先变为半透明状态,如果用户种植了植物,随后被点击的植物恢复初始状态,或者点击其他植物也可以恢复初始状态。在种植植物的过程中,程序会把种植了的植物对象和随机产生的僵尸的对象添加到战线类中,用于处理战斗的碰撞过程。

3.2.3 太阳花的种植及生产阳光实现

首先,建了特定的基类,太阳花类继承自生产植物基类,都有些特殊属性,比如特殊的动画;当安放了太阳花以后,会产生一个定时器,该定时器会定时的产生太阳花,太阳花产生的位置跟种植的太阳花有关,一般偏幅在10个像素左右;太阳花有其生命周期,当移动到收集的位置时,阳光值加加,然后阳光自身销毁。其次,种植植物太阳花时,做了很多判断,比如,是否落在了地图可种植区域、该地图位置是否已经种植了植物等。最后,如果太阳花被僵尸吃了,则会停止产生阳光的定时器来停止生产阳光同时太阳花植物本身销毁。

3.2.4 豌豆射手种植及产生豌豆实现

豌豆射手和豌豆都继承自植物基类,都有其特殊属性,豌豆有其移动的属性,从种植豌豆射手的位置,移动到某个位置,如果中途有僵尸则攻击,否则不产生。豌豆也设有定时器,监测该位置的这条线上是否有僵尸,如果有则产生豌豆。豌豆射手种植和太阳花差不多,都是判断是否落在可种植区域并且该位置没有种植植物即可安放。

3.2.5 生成僵尸的实现

僵尸不同于植物,僵尸的产生需要几个参数,移动的起始位置以及终点位置,以及移动过程中的不同动画的播放。对于僵尸的基类,有些抽象方法可实现,比如是否被攻击、是否攻击植物、运动过程中播放的动画等。僵尸的产生是随机的,调用了Random()方法生成了几个随机数,用于读取地图的僵尸起点坐标点,然后在相应的某条线上产生僵尸。

3.2.6 游戏弹窗的实现

在实现游戏弹窗的时候,采用以下方式:首先,暂停当前图层,调用当前图层的父类,添加一个新的图层,这个新的图层就是弹窗。这个新的图层也有点击事件的操作,比如,结束这个新的图层、继续当前图层。或者结束所有图层。

4 结语

在整个实现过程中,对游戏一些静态常量的使用不熟,比如在使用完静态常量以后,若不把静态常量重置的话会出现未知的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

猜你喜欢
僵尸图层引擎
笔记本电脑“僵尸”
你愿意当吸血鬼还是僵尸?
巧用混合图层 制作抽象动感森林
图层法在地理区域图读图中的应用
跟我学添加真实的光照效果
App已死?80%的僵尸应用带来的困惑
无形的引擎
基于Cocos2d引擎的PuzzleGame开发
“僵尸肉”横行谁之过
浅析“递层优化法”在矿井制图中的应用