APP下载

基于Cocos2d?x引擎的移动游戏设计与应用

2018-12-14吴晓雪何南缪新颖王魏

现代电子技术 2018年24期
关键词:碰撞检测手机游戏

吴晓雪 何南 缪新颖 王魏

关键词: 贪吃蛇; Cocos2d?x; 手机游戏; LUA; 逻辑功能设计; 碰撞检测

中图分类号: TN912.3?34; TP311.5               文献标识码: A                  文章编号: 1004?373X(2018)24?0106?04

Design and application of mobile game based on Cocos2d?x

WU Xiaoxue, HE Nan, MIAO Xinying, WANG Wei

(School of Information Engineering, Dalian Ocean University, Dalian 116023, China)

Abstract: A relaxation puzzle game called Gluttonous Snake suitable for the Android system is developed in the Visual Studio 2017 development environment by using the Cocos2d?x game engine and combining with the LUA script language. The overall framework of Android game development is proposed. The key technologies involved in Android game development are summarized, including the development environment configuration technology, logic function design technology and collision detection technology. Part of source codes of the Cocos2d?x mobile phone game engine are deeply analyzed, and the codes unsuitable for framework establishment of the Gluttonous Snake game are improved by using ways like inheritance and rewriting. The test results show that the system can achieve the basic functions of Gluttonous Snake, and has a certain reference value for design and implementation of the mobile phone game based on Cocos2d?x.

Keywords: Gluttonous Snake; Cocos2d?x; mobile phone game; LUA; logic function design; collision detection

Android是Google开发基于Linux平台的开源手机操作系统,包括操作系统、用户界面和应用程序[1]。手机游戏作为Android系统平台的一个重要组成部分,正在被越来越多的人重视,如何在手机平台上开发一款高效的系统框架成为主要考虑的因素[2]。

Cocos2d?x正是为提高游戏开发效率而诞生的一款优秀的游戏引擎,并且已经得到了广泛的应用,如捕鱼达人游戏和91部落游戏。Cocos2d?x允许开发者使用C++,Lua,JS等语言并编译到iOS,Android,Windows Phone,Mac OS X,微软桌面系统和Linux系统中,同时可以节省时间、减少精力和降低成本[3?4]。

本文基于Visual Studio开发环境,采用LUA脚本语言,结合Cocos2d?x游戏引擎,设计一款适用于Android系统的手机应用APP“贪吃蛇”。

1  游戏开发环境

由于Android操作系统内核是基于Linux系统的,且主要使用Java作为开发语言,而本文在Windows平台下开发Android程序,所以需要下载安装Windows平台下所需要的开发工具[5?6] ,如表1所示。

下载安装完Python以后需要配置环境变量 (下载地址:https://www.python.org)。点击我的电脑,选择属性,点击环境变量,选择Path路径,把刚刚安装Python时选择的路径放在Path路径里面,待配置完环境变量后运行客户端,在cmd命令行下键入Python,如果得到Python的版本信息表示安装完成,如图1所示。

2  游戏设計

2.1  游戏功能描述

参考经典贪吃蛇游戏规则并改进此游戏,程序主要实现的功能如下:

1) 模式选择。点击进入游戏,游戏启动后会出现“吃”“不吃”“吃不吃”三种模式进行选择,选择任意模式进入游戏。

2) 角色设计。游戏开始后蛇从左向右移动,随机生成食物和障碍物,蛇需要躲避障碍物和吃食物来增长身体长度获得分数,通过滑动屏幕改变蛇运动方向,如果蛇在移动中撞到墙、障碍物或者蛇身体,蛇死亡游戏结束。按游戏界面左上角“返回”键或者按“home键”即可退出游戏。

3) 音效设计。为了增加玩家的体验感,需要根据游戏的具体场景来增加适当的音效,包括背景音效、游戏过关音效以及游戏失败的音效。

2.2  游戏设计框架

游戏的设计思想:用数组变量[7]描述蛇的状态。首先进行初始化,包括:蛇头、蛇身体、运动方向、蛇身长度和节点数。第二,游戏者选择关卡进入游戏,蛇开始移动,在每次移动前判断是否滑动屏幕,有则修改蛇的运动状态。第三,判断下一步蛇是否吃到食物,若吃到食物则移动一步,清除尾点,蛇身体长度加1,反复直至蛇碰到障碍物死亡,游戏结束,状态如2图所示。

3  游戏的基本实现

3.1  类模块设计

程序实现主要用到的类模块有MainScene.lua主界面类。GameScene.lua游戏背景和游戏场景绘制类。GameLayer.lua布景层类,包括数据初始化、数据更新、生成食物和障碍物、游戏刷新、事件回调。利用SnakeBody.lua定义蛇类,包括蛇头、蛇身体、方向、拐弯点、初始化。SnakeManager.lua生成食物和障碍物,确定产生范围,控制蛇身体增长,改变蛇移动方向等。

3.2  主要代码

1) 围墙

围墙是由不可见的50行25列方格和可见的图片组成,该部分均在function GameScene:showMap()中实现定义起始行列、结束行列、空隙local startX,startY, endX,endY,space。

space = BodyRadius*2                 //空隙是蛇身半径的2倍

循环划线

for i=1,xCount+1 do

startX=(display.cx?space*xCount*0.5)+ space*(i?1)

startY = display.cy?space*yCount*0.5

endX = startX

endY = display.cy+space*yCount*0.5

self.drawNode_:drawLine(cc.p(startX,startY), cc.p(endX, endY), cc.c4f(1, 0, 0, 1))

根据划线范围界定游戏中蛇的活动范围、食物和障碍物出现的范围。

cc.exports.GameMinX= display.cx?space*xCount*0.5

cc.exports.GameMaxX=display.cx+space*xCount*0.5

cc.exports.GameMinY= display.cy?space*yCount*0.5

cc.exports.GameMaxY=display.cy+space*yCount*0.5

2) 蛇的创建

定义蛇类,按照传入的bodyType创建蛇,包括身体类型、方向、拐弯点、初始化。在function SnakeBody:init()中实现初始化,直接把最初要呈现给玩家的蛇的情况定义出来,使得在最初开始游戏时,有蛇可以进行自由移动。如果蛇身节数为空,则创建蛇身并添加到父级SnakeBody中。在function SnakeBody:drawSnake()中创建蛇身体、食物和障碍物。蛇身体、食物和障碍物由圓圈组成,当蛇身类型为0或1时分别用不同的颜色画出。蛇身类型为0时其性质为食物,用绿色显示;蛇身类型为1时其性质为障碍物,用蓝色显示。

function SnakeBody:init()

if self.drawNode_ == nil then

self.drawNode_= cc.DrawNode:create(1)

self:addChild(self.drawNode_)

end

local color

if self.bodyType_ == 0 then

color = cc.c4f(0, 1, 0, 1)

else

color = cc.c4f(0, 0, 1, 1)

end

self.drawNode_:drawCircle(cc.p(0, 0), BodyRadius, 0, 8, false, color)

end

3) 碰撞检测

通常针对2D游戏常用到的检测技术有矩形检测、圆形检测和像素检测。矩形检测方法是,每个物体记录一个能将自己框住的最小矩形的左上角坐标和矩形长宽,碰撞时判断矩形与矩形是否重叠,而这仅需4次比较即可得出,速度较快,所以本文选用矩形检测法进行碰撞检测[8]。

首先确定碰撞检测对象,本游戏中蛇头、食物和障碍物都需要碰撞检测。如果蛇头和食物发生碰撞蛇长度加1,如果蛇头和障碍物发生碰撞,蛇死亡游戏结束。下面是该检测方法的算法:取两个矩形实体的左上角坐标(x1,y1)和(x2,y2)以及二者的宽度w1,w2和高度h1,h2;判断是否x1<x2+w2,且x2<x1+w1,且y1<y2+h2,且y2<y1+h1。如果满足这4个条件,则说明两个矩形实体发生了碰撞[9]。

function SnakeBody:getBox()用于获取snakebody所在的矩形区域,判断碰撞;myRect = cc.rect(x,y,w,h),x,y是矩形左上角坐标,w,h是矩形的宽和高。checkContainsRectPoints函数判断蛇头矩形和食物矩形是否重叠。

//判断snake是否撞到食物或者障碍物

count = #self.foodArr_                   //将food总数赋给count

local oneFood

for i=1,count do

oneFood= self.foodArr_[count+1?i] //Index是食物在foodArr_中的序数,将self.foodArr_中存储的所有food依次赋给oneFood。

//如果蛇头撞到食物,food的类型是1,即撞到障碍物或者围墙,蛇死亡游戏结束

if self.snakeArr_[1]:checkContainsRectPoints(oneFood:

getBox()) then

if oneFood.bodyType_ == 0 then

self:changeSnake(count+1?i)

else if oneFood.bodyType_ == 1 then

self.gameLayer_:gameOver()

4) 改变蛇运动方向

根据触摸方法中获得两个点的位置来判断手指滑动的方向,在方法function SnakeBody:setDirection(pos)中实现,若新方向和原方向相同,则不做处理;若新方向和原方向不同,设置转弯的坐标,使snake中其他的snakebody随后也在这个坐标位置转弯。

//设置转弯的坐标

function SnakeBody:setTurnPos(pos)

self.turnPos_ = pos

//获得转弯的坐标

function SnakeBody:getTurnPos()

return self.turnPos_

//获得移动方向

function SnakeBody:getDirection()

return cc.p(self.direction_.x, self.direction_.y)

//设置移动方向

function SnakeBody:setDirection(pos)

//若和当前方向相同

if pos.x == self.direction_.x and pos.y == self.direction_.y

then

return false

//判断新的方向是否合法,x,y是-1~1之间的数字,新的x,y必须和旧的x,y不同

local bValid = false

if pos.x ~= 0 or pos.y ~= 0 then

if self.direction_.x==0 and self.direction_.y == 0 then

bValid = true

else if self.direction_.x ~= 0 and pos.y ~= 0 then

pos.x = 0 bValid = true

else if self.direction_.y ~= 0 and pos.x ~= 0 then

pos.y = 0 bValid = true

end

if   bValid == true then

self.direction_ = cc.p(pos.x, pos.y)

local posX, posY = self:getPosition()

end

return bValid

end

4  程序测试

测试程序时,首先将游戏的APK文件下载到Android手机上并进行安装,安装完成后手机上显示游戏图标,点击贪吃蛇图标运行结果如图3所示,进入游戏开始界面,选择关卡进入游戏。当蛇撞到围墙或者障碍物时,蛇死亡游戏结束,如图4所示。

5  结  语

本文采用Cocos2d?x引擎系统创建贪吃蛇游戏,利用Cocos2d?x进行图形渲染,构建框架游戏、应用程序和图形界面的交互。系统在Visual Studio 2017平臺下,采用LUA脚本语言进行编程。经测试,系统可以实现贪吃蛇的基本功能。本文通过对游戏开发环境、实现功能、框架设计进行介绍,并对程序中重要代码进行分析,掌握了利用Cocos2d?x游戏引擎编程的思想,可以将Cocos2d?x易移植和模块化思想扩展到其他应用[10],满足不同的显示要求,极大地缩短了游戏开发周期,对移动端游戏开发有重要意义。

注:本文通讯作者为王魏。

参考文献

[1] 陈羽修.基于Android贪吃蛇游戏的设计与实现[J].科技视界,2016(1):220?221.

CHEN Yuxiu. Design and implementation of Gluttonous Snake game based on Android [J]. Science & technology vision, 2016(1): 220?221.

[2] 舒沂.基于Cocos2d?x引擎的手机游戏快速开发工具的设计与实现[D].南京:南京大学,2013.

SHU Yi. Design and implementation of fast development tools based on Cocos2d?x engine for mobile phone games [D]. Nanjing: Nanjing University, 2013.

[3] 李勇.基于Cocos2d?x引擎的游戏架构设计与实现[D].北京:北京邮电大学,2015.

LI Yong. Design and implementation of game framework based on Cocos2d?x engine [D]. Beijing: Beijing University of Posts and Telecommunications, 2015.

[4] 霍常伟.基于Cocos2d?x引擎的移动游戏UI系统设计及应用[D].北京:北京交通大学,2012.

HUO Changwei. Design and application of UI system based on Cocos2d?x engine for mobile game [D]. Beijing: Beijing Jiaotong University, 2012.

[5] 韩文智,骆文亮.Android平台的移动APP开发方法与应用研究[J].四川理工学院学报(自然科学版),2015,28(3):22?26.

HAN Wenzhi, LUO Wenliang. Development method and application research of mobile APP based on Android platform [J]. Journal of Sichuan University of Science & Engineering, 2015, 28(3): 22?26.

[6] 佚名.Android开发:开发环境搭建之工具下载[EB/OL].[2014?02?13]. https://jingyan.baidu.com/article/9989c746006248f648ecf

eb7.html.

Anon. Android development: downloading of tools for development environment establishment [EB/OL]. [2014?02?13]. https://jingyan.baidu.com/article/9989c746006248f648ecfeb7.html.

[7] 贺敬凯.基于FPGA平台下的贪吃蛇游戏开发研究[J].深圳信息职业技术学院学报,2015,13(3):17?21.

HE Jingkai. Development of snake game based on FPGA platform [J]. Journal of Shenzhen Institute of Information Technology, 2015, 13(3): 17?21.

[8] 崔浩然.基于Android平台的手机游戏的设计与實现[D].西安:西安科技大学,2011.

CUI Haoran. Design and implementation of mobile phone game based on Android platform [D]. Xian: Xian University of Science and Technology, 2011.

[9] 杨传亿.基于移动设备的教育游戏的设计与开发[D].上海:华东师范大学,2010.

YANG Chuanyi. Design and development of education games based on mobile devices [D]. Shanghai: East China Normal University, 2010.

[10] 杨伟,肖义平.基于STM32F103C8T6单片机的LCD显示系统设计[J].微型机与应用,2014,33(20):29?31.

YANG Wei, XIAO Yiping. LCD display system design based on MCU STM32F103C8T6 [J]. Microcomputer & its applications, 2014, 33(20): 29?31.

[11] 周飞龙.Cocos2d?x引擎中MVC框架的设计与实现[D].武汉:华中科技大学,2013.

ZHOU Feilong. Design and implementation of MVC framework on Cocos2d?x engine [D]. Wuhan: Huazhong University of Science and Technology, 2013.

猜你喜欢

碰撞检测手机游戏
全新预测碰撞检测系统
基于手机游戏中UI界面的交互设计研究
基于BIM的铁路信号室外设备布置与碰撞检测方法
陕西省大学生手机游戏迷恋度实证分析
让手机游戏成为传统文化的传播新渠道
Unity3D中碰撞检测问题的研究
手机游戏对大学生的负面影响及对策分析
空间遥操作预测仿真快速图形碰撞检测算法
BIM技术下的某办公楼项目管线碰撞检测
双臂钻车钻臂与巷道的碰撞检测方法研究