计算机类论文
唐山师范学院本科毕业论文
题 目 基于Android 系统的桌球桌球游戏的设计与实现 学 生 杨景岗
指导教师 闫敬 副教授 年 级 2010本科班 专 业 计算机科学与技术 系 别 计算机科学系
唐山师范学院计算机科学系
2014年5月
郑重声明
本人的毕业论文(设计)是在指导教师 闫敬 的指导下独立撰写完成的。如有剽窃、抄袭、造假等违反学术道德、学术规范和侵权的行为,本人愿意承担由此产生的各种后果,直至法律责任,并愿意通过网络接受公众的监督。特此郑重声明。
毕业论文(设计)作者(签名):
年 月 日
目 录
标 题 . ................................................................... 1 摘 要 .................................................................... 2 一. 前言 .................................................................. 2
1.1桌球游戏开发目的 ........................................ 2 1.2桌球游戏的背景 .......................................... 2 1.3桌球游戏的开发技术与环境 ................................ 2
二. 桌球游戏的需求分析 .................................................... 2
2.1 桌球游戏的策划 .......................................... 2 2.2 安卓平台下桌球游戏开发的准备工作 ........................ 3
三. 桌球游戏的设计 ........................................................ 4
3.1 桌球游戏框架简介 ........................................ 4 3.2各个类的简要介绍 ........................................ 5 3.2.1. 界面相关类 ........................................... 5 3.2.2. 辅助类 . .............................................. 6 3.2.3. 常量头文件 ........................................... 6 3.2.4. 其他类及源程序 ....................................... 6
四. 桌球游戏的实现 ........................................................ 6
4.1. 界面相关类 . ............................................. 6 4.1.1界面管理类SceneManager. ............................... 7 4.1.2菜单界面类MenuLayer ................................... 7 4.1.3关于界面类AboutLayer .................................. 8 4.1.4帮助界面类HelpLayer ................................... 9 4.1.5声音设置类MusicLayer .................................. 9
4.1.6桌球游戏模式选择界面类ChoiceLayer .................... 11 4.1.7分数查看界面类ScoreLayer ............................. 11 4.1.8桌球游戏界面类GameLayer .............................. 11 4.2. 辅助类 . ............................................... 12 4.2.1桌球精灵辅助类TableBall .............................. 12 4.2.2刚体碰撞回调类MyContactListener ...................... 13 4.3 其他类及源程序 ......................................... 14 4.3.1主程序—main ......................................... 14 4.3.2 场景创建类AppDelegate ............................... 14 4.4桌球游戏界面展示 ....................................... 17
五. 结束语 .............................................................. 18 参考文献 ................................................................ 19 致 谢 .................................................................. 20 外 文 .................................................................. 21
基于Android 系统的桌球桌球游戏的设计与实现
杨景岗
摘 要 随着安卓平台上休闲类小桌球游戏变得越来越丰富,休闲类桌球小桌球游戏也变得日渐流行,这类桌球游戏不仅操作简单而且富有一定的技术难度,经常受到桌球游戏爱好者的追捧,因此,我们将开发一款基于Android 平台的体育类桌球游戏——2D 桌球(Billiard_2D). 本桌球游戏是一款使用cocos2d-x 与Box2d 相结合进行图像渲染的Android 平台的休闲类桌球小桌球游戏,本桌球游戏是基于c++语言开发利用了cocos2d-x 中的大量的特效,极大的丰富了桌球游戏的视觉效果,增强了用户体验,同时本桌球游戏中的物理模拟用到了cocos2d-x 提供的Box2d 物理引擎,桌球运动十分真实,酷炫。
关键词 安卓 cocos2d-x Box2d 桌球游戏 追捧
一. 前言
1.1桌球游戏开发目的
随着Android 手机的不断发展,城市化发展越来越快,竞争也越来越大,一款休闲,益智的小桌球游戏已成为当今时代人们缓解压力的不二选择,功能也不断的多样化,而概要设计正是体现出2D 桌球的基本概念。学习安卓已经有了一段时间,在不断的学习与开发过程中,对Android 开发平台也有了基本的认识。阅读了一些相关资料之后,便开始了基于Android 桌球游戏开发的项目2D 桌球,以此来完成这款桌球游戏。 1.2桌球游戏的背景
近年来社会生活节奏不断加快,人们往往没有过多的时间来玩一款大型的桌球游戏,相反越来越多的人们更加倾向于一些休闲类的小桌球游戏,比如现在比较流行的的休闲类桌球桌球游戏“3D 桌球”, “美式2D 桌球”, 因为其画面丰富精美,桌球游戏可玩性高,在用户中受到了热捧。
1.3桌球游戏的开发技术与环境
Android 的兴起大大扩大了移动终端的游戏市场,也由此产生了一个迫切的需求,即游戏开发需要同时部署在两个热门平台上,但是为一个游戏维护两套代码的代价是非常昂贵的,尤其是在两个平台的主流语言,主流引擎还不统一的情况下。因此,基于c++语言,以cocos2d —iPhone 为基础开发的Cocos2d —x 出现了,桌球游戏就是在这样一个平台上产生的,并且此游戏在Eclipse 编译器下编译而成的。
二. 桌球游戏的需求分析
桌球游戏开发的前期准备工作,主要包含桌球游戏的策划和桌球游戏中资源的准备。 2.1 桌球游戏的策划
桌球游戏的策划主要包含:桌球游戏类型定位、呈现技术以及目标平台的确定等工作。 (1)桌球游戏类型
该桌球游戏的操作为触屏,通过点击屏幕右下角的“Go ”按钮,击打母球,通过触控改变母球击球的方向,通过改变力度条的高度,改变击打母球的力度,属于休闲类桌球游戏。 (2)运行目标平台
桌球游戏目标平台为Android2.2及以上版本。桌球游戏中运用了大量的cocos2d-x 中的粒子系统,CPU 运算速度较慢的设备运行桌球游戏时桌球游戏效果会比较差。 (3)操作方式
桌球游戏所有关于桌球游戏的操作为触屏,玩家可以操纵球杆的方位,球杆击打母球的力度,通过将一种球全部打入洞中,最后将黑八打入洞中从而取得桌球游戏的胜利。
(4)呈现技术
桌球游戏完全采用cocos2d-x 引擎进行桌球游戏场景的搭建和桌球游戏特效的处理,比如桌球游戏中的进洞效果、各个界面之间多变的切换效果,用Box2d 引擎进行物理的碰撞模拟,比如球之间的碰撞,球与边界之间的碰撞等,这些功能是cocos2d-x 中所独有的,用起来简单方便,但所呈现的效果却非常强大,cocos2d-x 的这种方便高效的特点,极大地增强了玩家的桌球游戏体验。 2.2 安卓平台下桌球游戏开发的准备工作
进行开发前的准备工作,包括搜集和制作图片、声音等,其详细开发步骤如下。
(1)首先为读者介绍的是本桌球游戏中用到的图片资源,系统将所有图片资源都放在项目文件下的Resources/pic文件夹下,如表1-1所列。
表2-1 图片清单
(2)接下来介绍桌球游戏中用到的声音资源,系统将声音资源放在项目目录中的Resources/sound文件夹下,其详细情况如表1-2所列。
表2-2 声音清单
(3)最后介绍桌球游戏中用到的文件,系统将资源放在项目目录中的文件夹下,其详细情况如表1-3所列。
表2-3 粒子系统文件清单
三. 桌球游戏的设计
桌球游戏的架构包括界面相关类、辅助类、常量头文件、桌球游戏控制类和工具类等。 3.1 桌球游戏框架简介
桌球游戏的整体架构介绍,桌球游戏框架如图1-13和图1-14所示。
图3-1桌球游戏框架图
说明:图1-13中列出的为主程序、场景创建类、以及桌球游戏界面类,其各自功能以及具体实现将在后续详细介绍,读者这里不必深究。 图1-14是桌球游戏开发中用到的辅助类、常量头文件,辅助类主要用于创建桌球以及进行刚体碰撞时的处理,常量头文件用于存储桌球游戏需要的一些常量。
图3-2 辅助类、常量头文件
按照程序运行的顺序逐步介绍各个类的作用以及整体的运行框架.
(1)启动桌球游戏,首先通过main 入口进入整个程序的,然后进入第一个场景菜单场景界面MenuLayer ,在该界面上主要有5个按钮从左到右依次为“关于“按钮,“帮助“按钮,“开始桌球游戏“按钮,“设置“按钮,“退出“按钮,通过触屏滑动操作能使按钮左右移动,点击相应的按钮会执行相应的操作。
(2)点击“关于”按钮后进入关于界面,该界面主要负责介绍此桌球游戏的名称,版本号,版权所有者等,点通过击手机的“返回键“按钮能够返回到主菜单界面。
(3)点击“帮助”按钮后进入帮助界面,该界面主要负责介绍此桌球游戏的玩法,通过控制球杆的方向与力的大小将同类桌球击打进洞,同时介绍了桌球游戏的微调按钮,模式转换按钮,辅助线按钮等。
(4)点击“开始桌球游戏”按钮后进入桌球游戏模式选择界面。
(5)点击桌球游戏选择模式界面的“计时模式”按钮后进入桌球游戏为倒计时模式,点击“练习模式”按钮后进入桌球游戏为练习模式,点击“排行榜”按钮后进入得分界面,该界面显示的是玩家在计时模式中取得胜利的日期、分数等,通过触屏的上下滑动控制记录的滑动,方便玩家查看历史记录。
(6)在菜单界面点击“设置“按钮,会跳转到声音设置界面MusicLayer ,该界面主要是进行桌球游戏过程中的背景音乐与音效播放标志位的设置,点击手机的返回键按钮返回菜单界面。 (7)在菜单界面点击“退出“按钮,退出整个应用程序。 3.2各个类的简要介绍 3.2.1. 界面相关类
(1)界面管理类SceneManager
该类为桌球游戏程序中管理各个界面的类,主要负责创建并规定第一个界面,然后实现从当前界面跳转到其他界面的方法,所以界面管理类是coco2d-x 程序中必须有的一个类。
(2)菜单界面类MenuLayer
该类为菜单界面类,从左到右依次为“关于“按钮,“帮助“按钮,“开始桌球游戏“按钮,“设置“按钮,“退出“按钮,通过触屏滑动操作能使按钮左右 移动,点击相应的按钮会执行相应的操作。
(3)关于界面类AboutLayer
该类为关于界面类,该界面主要负责介绍此桌球游戏的名称,版本号,版权所有者等,通过点击手机的“返回键“按钮能够返回到主菜单界面。
(4)帮助界面类HelpLayer
该类为帮助界面类,该界面主要负责介绍此桌球游戏的玩法,通过控制球杆的方向与力的大小将同类桌球击打进洞,同时介绍了桌球游戏的微调按钮,模式转换按钮,辅助线按钮等。
(5)声音设置类MusicLayer
该类为声音设置界面类,该界面主要负责设置桌球游戏过程中背景音乐与音效的播放,该层为
MenuLayer 的子层,共有4个按钮,为“off “按钮与”on “按钮,通过点击声音控制按钮开关,
控制声音播放。
(7)桌球游戏模式选择类ChoiceLayer
该类为桌球游戏模式选择类,该界面有3个按钮,点击“计时模式“按钮,进入计时模式,点击”练习模式“按钮,进入练习模式,点击”排行榜“按钮,进入分数查看界面。
(8)分数查看界面类ScoreLayer
该类为分数查看界面,该界面主要记录玩家在计时模式胜利时的时间与分数,通过上下滑动能够让历史记录精灵上下滑动,方便玩家查看历史记录。
(9)桌球游戏界面类GameLayer
该类为桌球游戏界面类,实现了主桌球游戏场景的搭建,桌球游戏中所有的精灵对象都添加到该层之上,并进行显示,玩家通过触控对球杆进行操作,通过点击按钮击打白色桌球。
3.2.2. 辅助类
(1)桌球类TableBall
该类为桌球类,主要负责创建桌球,初始化桌球的索引号,桌球的图片等,并实现了根据桌球速度不断为桌球换纹理图的功能,与检测是否需要删除桌球,播放进洞特效的方法。
(2)刚体碰撞回调类MyContactListener
该类为刚体碰撞回调类,主要负责进行刚体之间碰撞的处理,在创建物理世界的时候为物理世界加上此监听,刚体碰撞的时候就会调用此类中重写的父类方法,主要是进行音效播放的处理。
3.2.3. 常量头文件
主要介绍本桌球游戏的中用到的一些常量,这些常量都存储在相关的头文件中
桌球游戏的常量头文件AppMacros ,该头文件中定义并创建了图片、个体,定义了程序的标准分辨率和场景中一些精灵的层次。桌球游戏的第二个常量头文件JNIUtil ,在该头文件进行数据信息的存储,与取出。桌球游戏的第三个常量头文件GameInfo ,在该头文件进行桌球游戏中一些常用数据的定义,例如球台的位置等个点构成封闭的线段,menuItemPosition 为MenuLaye r 界面5个按钮的坐标信息。 说明:将桌球游戏中桌球,球台等的位置信息放入头文件中,方便管理,提高了程序的可维护性。如果以后用到关卡设计器的话,也可以直接利用这些数据进行关卡设计,简洁方便。
(1)头文件AppMacros
该头文件中定义并创建了图片、声音套装的结构体,并定义了程序的标准分辨率和场景中一些精灵的层次,声明了桌球游戏中经常用到的常量。
(2)头文件JNIUtil
该头文件的主要作用是通过JNI 与java 端sdk 的preference 相连,将一些简单数据存储,并在需要的时候取出存储在editor 中的数据,主要存储背景音乐与音效播放的标志,与分数、日期等。
(3)头文件GameInfo
该头文件中定义了桌球的半径,整个物理世界与绘制的缩放比,球台的长与宽,母球的初始位置,能量条的位置,按钮的位置,指针的位置以及边界的24个点坐标等。
3.2.4. 其他类及源程序
(1)主程序main
该主程序为程序的入口,当程序运行时会从此进入,然后执行cocos2d-x 程序。
(2)场景创建类AppDelegate
该类为场景创建类,主要负责创建桌球游戏场景的导演并初始化第一个场景,然后加载桌球游戏用到的所用声音资源,并实现程序进入前台或者后台时的回调方法。
四. 桌球游戏的实现
4.1. 界面相关类
桌球游戏的界面相关类,首先是桌球游戏界面的管理者,然后是桌球游戏的各个界面是如何开发的,从而逐步完成对桌球游戏界面的开发,下面就对这些类的开发进行详细的介绍。
4.1.1界面管理类SceneManager.
桌球游戏的界面管理者SceneManage r 类,该类的主要作用是管理各个界面,然后创建第一个界面,并实现从当前界面跳转到其他界面的方法,其类具体的开发步骤如下。
(1)首先给出的是SceneManager 类的头文件代码,该头文件中声明了本类中所需要的方法和各个场景的指针,其详细代码如下。
1 #ifndef __SceneManager_H__ 2 #define __SceneManager_H__ 3 #include "cocos2d.h"
4 using namespace cocos2d; //使用命名空间 5 class SceneManager{ 6 public:
7 cocos2d::CCScene* createScene(); //创建第一个对象的方法 8 CCScene *menuScene; //菜单场景的引用 9 CCScene *gameScene; //桌球游戏对象的引用 10 void goMenuLayer(); //创建场景对象的方法 11 void goGameLayer(bool isdaojishi); //去桌球游戏界面的方法 12 }; 13 #endif
说明:上述代码为SceneManager 类的头文件,在该头文件中声明了桌球游戏中所有界面的指
针,并声明了创建桌球游戏第一个场景的方法和切换到其它界面的方法。
(2)然后给出的是SceneManager 类的具体代码,在该类中实现了创建第一个场景的方法和切换,具体实现步骤请查看SceneManager.cpp. 4.1.2菜单界面类MenuLayer
桌球游戏的的菜单界面,该界面中有五个按钮,玩家通过点击屏幕中不同功能的按钮实现不同的界面的切换以及桌球游戏的退出。
(1)首先是MenuLayer 类的头文件代码,该头文件声明了本类需要的按钮、精灵、指针、变量和按钮的回调方法,其详细代码在MenuLayer.h.
1 #ifndef _MenuLayer_H_ 2 #define _MenuLayer_H_ 3 #include "cocos2d.h" //引入头文件 4 #include "SceneManager.h" //引入头文件 5 using namespace cocos2d; //使用命名空间 6 class MenuLayer : public CCLayer{ 7 public: 8 virtual bool init(); //初始化的方法 9 virtual void keyBackClicked(); //返回键监听的回调方法 10 virtual void registerWithTouchDispatcher(void); //触控的注册回调方法 11 //从父类继承来的触控按下的方法 12 virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent); 13 //从父类继承来的触控移动的方法 14 virtual void ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent); 15 //从父类继承来的触控结束的方法 16 virtual void ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent); 17 //从父类继承来的触控取消的方法 18 virtual void ccTouchCancelled(cocos2d::CCTouch *pTouch,cocos2d::CCEvent
*pEvent); 19 CREATE_FUNC(MenuLayer); 20 public: 21 void initButton(); 22 void aboutCallback(CCObject* pSender); 23 void helpCallback(CCObject* pSender); 24 void startCallback(CCObject* pSender); 25 void setCallback(CCObject* pSender); 26 void exitCallback(CCObject* pSender); 27 void recoverSet(CCObject* pSender); 28 public: 29 float distance_X; 30 int index; 31 int menuCount; 32 SceneManager* bsm; 33 CCSize visibleSize; 34 CCPoint origin; 标 35 CCPoint startPoint; 36 cocos2d::CCMenu* pMenu; 37 cocos2d:: CCMenuItemImage* nMenu; 38 CCArray *menuArray; 39 }; 40 #endif
//资源的释放
//初始化按钮的方法 //关于按钮的回调方法 //帮助按钮的回调方法 //开始桌球游戏按钮的回调方法 //音效设置按钮的回调方法 //退出按钮的回调方法 /恢复设置
//x移动距离 //当前是第几个按钮 //按钮数组大小 //场景管理器 //获取可见区域尺寸 //获取可见区域原点坐
//记录起始点击的点 //菜单按钮 //当前选中的按钮 //按钮列表
说明:第8~18行依次为初始化的方法、返回键监听的回调方法以及重写的父类的与触控相 的代码,第21~27行依次为初始化按钮的方法,以及菜单界面按钮的回调方法。第28~40行依次为,x 方向移动距离、当前按钮选项,按钮数组大小、场景管理器、可见区域尺寸、原点坐标、起始点点击点坐标、菜单按钮,当前选中按钮、按钮列表等变量的声明。
(2)MenuLayer 类的具体代码,在该类中创建了背景和所有的按钮,并为其设置了出场特效、然后实现了所有按钮的回调方法,首先要介绍的是本类的第一部分init 方法,此方法用于初始化布景、常用变量、按钮和一些相关资源,请查看MenuLayer.cpp 。 4.1.3关于界面类AboutLayer
桌球游戏的关于界面,该界面用于介绍桌球游戏名称、版本号以及版权所有者,该界面开发起来比较简单,其具体的开发步骤如下。
(1)首先是AboutLayer 类的头文件代码,其主要定义了回调方法,按钮,场景管理器的引用,可见区域大小,可见区域原点坐标,以 及背景精灵,其详细代码AboutLayer.h 。
1 2 3 4 5 6 7 8 9 10
#ifndef _AboutLayer_H_ #define _AboutLayer_H_ #include "cocos2d.h" class AboutLayer : public cocos2d::CCLayer{ public:
virtual bool init(); virtual void keyBackClicked(); CREATE_FUNC(AboutLayer); }; #endif
//导入头文件
//自定义的布景类 //初始化的方法 //返回键监听的回调方法 //最后为初始与释放资源
说明:上述代码主要为初始化关于界面的方法包括初始化的init 方法与返回键监听的回调方法keyBackClicked ,最后为初始与释放资源。
(2)然后是AboutLayer 类的具体代码,其详细代码请查看AboutLayer.cpp 。 4.1.4帮助界面类HelpLayer
桌球游戏的帮助界面,该界面用于介绍桌球游戏的玩法,与其他界面相比,该界面开发起来比较简单。
(1)首先是HelpLayer 类的头文件代码,其主要定义了回调方法,按钮,场景管理器的引用,可见区域大型,可见区域原点坐标,以及背景精灵,其详细代码在HelpLayer.h 。
1 #ifndef _HelpLayer_H_ 2 #define _HelpLayer_H_ 3 #include "cocos2d.h" //导入头文件 4 using namespace cocos2d; //使用命名空间 5 class HelpLayer : public cocos2d::CCLayer{ //自定义的布景类 6 public:
7 virtual bool init(); //初始化的方法 8 virtual void keyBackClicked(); //返回键监听的回调方法 9 virtual void registerWithTouchDispatcher(void); //触控的注册回调方法 10 //从父类继承来的触控按下的方法 11 virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent); 12 //从父类继承来的触控移动的方法 13 virtual void ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent); 14 //从父类继承来的触控结束的方法 15 virtual void ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent); 16 //从父类继承来的触控取消的方法 17 virtual void ccTouchCancelled(cocos2d::CCTouch *pTouch,cocos2d::CCEvent *pEvent); 18 //设置触控是否可用 19 void changeTouchEnable(CCObject* pSender); 20 CCSprite* help1; //第一张帮助图片 21 CCSprite* help2; //第二章帮助图片 22 int count; //计数器 23 CREATE_FUNC(HelpLayer); //初始化与释放资源 24 }; 25 #endif
说明:上述代码为HelpLayer 类的头文件,在该头文件中声明了HelpLayer 类中需要的初始
化方法与触控的回调方法,并定义了帮助背景精灵。
(2)HelpLayer 类的具体代码,主要是创建背景精灵,玩法图片精灵并实现了返回键的回调方法,其详细代码请查看HelpLayer.cpp. 4.1.5声音设置类MusicLayer
桌球游戏的的声音设置界面,该界面用于设置桌球游戏过程中的背景音乐播放与音效设置,与其他界面相比,该界面开发起来比较简单,其具体的开发步骤如下。
(1)首先是MusicLayer 类的头文件,该头文件中声明了本类用到的所有方法和定时回调方法,以及精灵、变量、按钮等,其详细代码目录下的MusicLayer.h 。
1 2
#ifndef _MusicLayer_h #define _MusicLayer_h
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 using namespace cocos2d; class MusicLayer: public CCLayer{ public: CCMenu* pMenu; CCMenuItemImage* soundon; CCMenuItemImage* soundclose; CCMenuItemImage* effecton; CCMenuItemImage* effectclose; CCSprite* soundon1; CCSprite* soundclose1; CCSprite* effecton1; CCSprite* effectclose1; public:
MusicLayer(); ~MusicLayer(); virtual bool init(); void initDialog(); virtual void keyBackClicked(); void menuCallbacKOpenMusic(); void menuCallbackCloseMusic(); void menuCallbackOpengEffect(); void menuCallbackCloseEffect(); CREATE_FUNC(MusicLayer); }; #endif
//使用命名空间
//菜单按钮 //创建声音按钮 //创建声音按钮 //创建音效按钮 //创建音效按钮 //对应精灵 //对应精灵 //对应精灵 //对应精灵 //初构函数 //析构函数 //初始化方法 //初始化按钮的方法 //返回键监听 //打开声音 //关闭声音 //打开音效 //关闭音效
//初始化以及资源的释放
说明:第8~16行为声音设置界面按钮以及精灵等变量的声明,具体包括菜单按钮,声音开关、音效开关按钮以及每个按钮在显示时其左侧对应的精灵图片等。第18~28行为声音设置界面中方法的声明,具体包括初构与析构函数,初始化按钮的方法,返回键监听的回调方法,以及界面中按钮按下时的回调方法等。
(2)MusicLayer 类的具体代码,关于该类的方法框架在上述头文件中声明方法的部分已经全部列出。首先是本类中用于初始化按钮以及背景精灵initDialog 方法,其详细代码见MusicLayer.cpp.
(3)下面是MusicLayer 界面返回键的回调方法与打开声音按钮的回调方法,其详细代码如
MusicLayer.cpp
1 void MusicLayer::keyBackClicked(){ //返回键监听的回调方法 2 MenuLayer* menuLayer = (MenuLayer*)this->getParent();//获取的父类 3 this->removeFromParentAndCleanup(false); //从父类中移除该层 4 menuLayer->setKeypadEnabled(true); //开启返回键监听 5 menuLayer->setTouchEnabled(true); //开启触控监听 6 menuLayer->nMenu->setEnabled(true); //设置按钮可用 7 }
8 void MusicLayer::menuCallbacKOpenMusic(){ //打开声音开关回调方法 9 CocosDenshion::SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); 10 JNIUtil::saveInt("musicFlag",0); //设置声音播放的标志位
13 14 15 }
soundclose->setVisible(true); soundclose1->setVisible(true); //设置按钮的可见性 //设置精灵的可见性
说明:第1~7行为返回键监听的回调方法,首先获取该层的父类,然后从父类中删除该层,接
下来开启父类的返回键监听、触控监听,最后设置父类的按钮菜单可用。第8~15行为打开声音开关的回调方法,首先暂停音乐的播放,然后将音乐播放的标志位变成0,最后设置对应按钮与按钮对应精灵的可见性。
4.1.6桌球游戏模式选择界面类ChoiceLayer
桌球游戏模式选择界面类,从该界面能选择不同的桌球游戏模式与查看排行榜,与其他界面相比,该界面开发起来比较简单.
(1)首先是ChoiceLayer 类的头文件,在该头文件中声明了ChoiceLayer 类中需要的初始化方法、返回键监听的回调方法、按钮的回调方法,并定义了菜单按钮指针代码在ChoiceLayer.h 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#ifndef _ChoiceLayer_H_ #define _ChoiceLayer_H_ #include "cocos2d.h" //导入头文件 class ChoiceLayer : public cocos2d::CCLayer{ //自定义的布景类 public:
virtual bool init(); //初始化的方法 virtual void keyBackClicked(); //返回键监听的回调方法 void initBuuton(); //初始化按钮的方法 void choice0Callback(); //choice0按钮的回调方法 void choice1Callback(); //choice1按钮的回调方法 void choice2Callback(); /choice2按钮的回调方法 cocos2d::CCMenu* p_menu; //菜单按钮指针 CREATE_FUNC(ChoiceLayer); }; #endif
说明:上述代码为ChoiceLayer 类的头文件,在该头文件中声明了ChoiceLayer 类中需要的
初始化方法、返回键监听的回调方法、按钮的回调方法,并定义了菜单按钮指针。 (2)下面介绍ChoiceLayer 类的具体代码,关于该类的方法框架在上述头文件中声明方法的部分已经全部列出,下面不再介绍该类的框架,该类的详细代码见桌球游戏代码ChoiceLayer.cpp . 4.1.7分数查看界面类ScoreLayer
桌球游戏的分数查看界面类,该界面用于查看玩家在计时模式中取得胜利的日期与得分,与其他界面相比,该界面开发起来比较简单,其具体的开发步骤如下。
(1)首先是ScoreLayer 类的头文件,在该头文件中声明了ScoreLayer 类中需要的初始化方法、返回键监听的回调方法、按钮的回调方法,在该头文件中定义了该类中用到的初始化界面精灵的方法以及变量,并声明了ScoreLayer 类中触摸的回调方法
(2)然后是ScoreLayer 类的具体代码,关于该类的方法框架在上述头文件中声明方法的部分已经全部列出。首先要是本类的第一部分init 方法,此方法用于初始化布景和一些相关资源,其详细代码请查看ScoreLayer.cpp.
(3)初始化该界面中时间、得分精灵的initAll_Info方法,其详细代码ScoreLayer.cpp 。 (4)分数查询界面的初始化图片的方法inTexture ,返回键监听方法keyBackClicked 以及重新的CCTouchMove 方法,其详细代码查看ScoreLayer.cpp 。
4.1.8桌球游戏界面类GameLayer
桌球游戏的分数查看界面类,该界面用于查看玩家在计时模式中取得胜利的日期与的得分,其
他界面相比,该界面开发起来比较简单,其具体的开发步骤如下。
(1)首先给出的是GameLayer 类的头文件,在该头文件中声明了GameLayer 类中需要的初始化方法、返回键监听的回调方法、按钮的回调方法,定时回调方法等,其详细代码如下。 (2)然后是上面省略的头文件中变量的声明等。
(3)GameLayer 类的具体代码,关于该类的方法框架在上述头文件中声明方法的部分已经 全部列出,下面不再介绍该类的框架。首先要介绍的是本类的析构函数与初构函数,此方法用于删除场景销毁时堆中的对象与初始化布景和一些相关资源包括初始化背景的initBackGround 方法 ,倒计时模式下初始化数字的initTimerSprite 方法,初始化图片名称的方法initPname 、初始化图片的方法initCCTexture2D 、初始化物理世界等的方法,创建刚体的createb2Body 方法。 (4)接下来介绍GameLayer 类中各个按钮的回调方法,进行物理模拟update 的回调方法,GameLayer 类中进行物理模之后,所有刚体速度小于阈值之后的回调方法afterBallStopCallback ,GameLaye r 类中重写的ccTouchMoved 方法以及计算球杆旋转角度以及前进方法的方法calculate_tableCue。
(5)GameLayer 类中计算球线的calculate_Line_Total方法,GameLayer 类中计算距离球线最近桌球的方法calculateBall 与计算从母球发出的辅助线的长度的方法,计算距计算第二根辅助线的方法方法calculate_Line2__ASSIST。 4.2. 辅助类
上面是桌球游戏的所有界面,接下来是该桌球游戏的辅助类,本程序的辅助类有TableBall 类、MyContactListener 类。
4.2.1桌球精灵辅助类TableBall
桌球精灵辅助类TableBall ,该类用于创建一个一个桌球,具体包括桌球的编号,桌球位移信息,起始点坐标,精灵对应的刚体等其具体的开发步骤如下。
(1)TableBall 类的头文件代码,这部分代码比较简单,用于声明和定义本类中需要的方法、变量等,其主要代码TableBall.h 。
1 #ifndef _TableBall_H_ 2 #define _TableBall_H_ 3 #include "cocos2d.h" //导入头文件 4 #include "string.h" //导入头文件 5 #include "Box2D/Box2D.h"
6 using namespace cocos2d; //使用命名空间 7 class TableBall : public CCSprite{
8 public:
//创建桌球精灵的方法
static TableBall * creates(CCTexture2D *pTexture,int tableBallIndex,float
displacement);
11 void setBallTexture(CCPoint ballSpeed); //根据速度设置帧动画
12 bool cross_Border(); //判断台球是否出边界的方法 13 public:
14 int tableBallIndex; //桌球编号 15 float displacement; //桌球位移 16 b2Body* body; //刚体
17 CCPoint startPosition; //起始点坐标 18 }; 19 #endif
说明:上述代码为TableBall 类的头文件,该头文件声明了创建桌球精灵的方法creates 、跟据速度设置桌球图片的方法setBallTexture 、判断桌球是否出边界的方法cross_Border,以及桌球编
号、桌球位移、桌球对应的刚体指针,起始点坐标。
(2)TableBall 类的具体代码,在该类中有三个方法,分别用于创建桌球精灵,设置桌球图片,
9
10
以及判断桌球是否超出边界。
4.2.2刚体碰撞回调类MyContactListener
刚体碰撞回调类,主要负责进行刚体之间碰撞的处理,在创建物理世界的时候为物理世界加上此监听,刚体碰撞的时候就会调用此类中重写的父类方法,主要是进行音效播放的处理。
(1)MyContactListener 类的头文件代码,这部分代码比较简单,用于声明和定义本类中需要的方法,其主要代码MyContactListener.h 。
#ifndef _MyContactListener_H_ #define _MyContactListener_H_ #include "cocos2d.h" //引入cocos2d 的头文件 #include "AppMacros.h" //引入常量头文件 #include "Box2D/Box2D.h" //导入头文件 using namespace cocos2d; //使用命名空间 class MyContactListener : public b2ContactListener{ public: MyContactListener(); //初构函数 ~MyContactListener(); //析构函数
virtual void BeginContact(b2Contact* contact); //刚体碰撞时的回调方法 virtual void EndContact(b2Contact* contact); //刚体碰撞结束时的回调方法 }; #endif
说明:上面是MyContactListener 类的头文件,该头文件主要是重新了其父类b2ContactListener 的刚体碰撞时的回调方法BeginContact 与刚接受碰撞时的回调方法EndContact 。
(2)MyContactListener 类的具体代码,在该类中包括刚体碰撞时的回调方法BeginContact 与刚接受碰撞时的回调方法EndContact ,其主要代码MyContactListener.cpp 。
1 ......//此处省略了一些导入头文件以及定义宏的代码
2 void MyContactListener::BeginContact(b2Contact* contact){//刚体碰撞时的回调方法 3 b2Fixture* fixtureA = contact->GetFixtureA(); //获取刚体描述 4 b2Fixture* fixtureB = contact->GetFixtureB(); //获取刚体描述 5 b2Body* bodyA = fixtureA->GetBody(); //获取刚体 6 b2Body* bodyB = fixtureB->GetBody(); //获取刚体 7 b2BodyType bodyAType = bodyA->GetType(); //获取刚体类型 8 b2BodyType bodyBType = bodyB->GetType(); //获取刚体类型 9 float speedA = (bodyA->GetLinearVelocity()).Length(); //计算刚体速度 10 float speedB = (bodyB->GetLinearVelocity()).Length(); //计算刚体速度 11 if(bodyAType == b2_dynamicBody&&bodyBType == b2_dynamicBody){ 12 if(speedA>0.5f||speedB>0.5f){ 13 if(bodyA->GetUserData()!=NULL&&bodyA->GetUserData()!=NULL){ 14 if(JNIUtil::getInt("effectFlag",1)==1){ 15 CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect( 16 "sound/hit.mp3" 17 );}}}}}
18 void MyContactListener::EndContact(b2Contact* contact){
//刚体碰撞结束时的回调方法 19 }
1
2 3 4 5 6 7 8 9 10 11 12 13 14
说明:第3~4行为获取两个碰撞刚体的刚体描述,第5~6行为获取两个碰撞刚体的刚体指针,第7~8行为获取两个碰撞刚体的类型。第9~10行为计算两个刚体的速度。第11~17行为根据刚体速度以及刚体类型进行音效播放的判断,具体的判定条件为如果两个刚体都是非静态的表示两个刚体是桌球,同时满足如果两个桌球中有一个速度大于0.5则可以播放音效,第18~19将为刚体碰撞结束时的回调方法。
4.3 其他类及源程序 4.3.1主程序——main
所有的程序都会有一个入口主程序,cocos2d-x 也不例外,利用cocos2d-x 开发的主程序则为main ,该主程序是cocos2d-x 中必不可少,如代码main.h 。
1 #include //引入jni 头文件 2 #include //引入log 头文件 3 #include "platform/android/jni/JniHelper.h" //引入平台头文件
4 #include "AppDelegate.h" //引入AppDelegate 头文件 5 #define LOG_TAG "main" //声明相关宏 6 //定义宏
7 #defineLOGD(...)
__android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
8 using namespace cocos2d; //声明cocos2d 命名空间 9 extern "C"{ //调用C
10 jint JNI_OnLoad(JavaVM *vm, void *reserved){ //设置java 虚拟机方法 11 JniHelper::setJavaVM(vm); //设置java 虚拟机 12 return JNI_VERSION_1_4; //返回版本号 13 }
14 //本地的初始化方法
15 void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv* env, jobject this, jint w, jint h){
16 //若导演对应的绘制用OpenGLView 不存在,则说明应用程序刚刚进来需要进行初始化 17 if (!CCDirector::sharedDirector()->getOpenGLView()){
18 CCEGLView *view = CCEGLView::sharedOpenGLView();
//获取绘制用OpenGLView 19 view->setFrameSize(w, h); //设置尺寸 20 AppDelegate *pAppDelegate = new AppDelegate();
//创建自己的应用程序对象 21 CCApplication::sharedApplication()->run(); //运行应用程序 22 }else{
//若导演对应的制用OpenGLView 存在,则说明应用程序已经初始化了做一些必要工作即可 23 ccDrawInit();
24 ccGLInvalidateStateCache();
25 CCShaderCache::sharedShaderCache()->reloadDefaultShaders(); 26 CCTextureCache::reloadAllTextures();
27 CCNotificationCenter::sharedNotificationCenter()->postNotification 28 (EVNET_COME_TO_FOREGROUND, NULL); 29 CCDirector::sharedDirector()->setGLDefaultValues(); 30 }}}
说明:第1~8行为导入相应的头文件、声明宏以及命名空间。第9~13行为设置java 虚拟机的方法并返回JNI 的版本号。第14~30行为创建自己的应用程序对象的方法,创建好应用程序对象后就可以让系统运行自己开发的应用了。 4.3.2 场景创建类AppDelegate
桌球游戏中第一个界面是AppDelegate 类实现,下面就给出AppDelegate 类的开发代码。
(1)首先介绍AppDelegate 类的头文件,该头文件负责声明构造函数、析构函数、初始化方法、程序进入后台和前台时系统需要调用的方法以及加载背景音乐与音效的方法,其代码
AppDelegate.h 。
1 #ifndef _AppDelegate_H_ //如果没有定义此头文件,定义头文件 2 #define _AppDelegate_H_ //定义此头文件 3 #include "cocos2d.h" //导入cocos2d 头文件 4 class AppDelegate : private cocos2d::CCApplication{ //自定义类 5 public: //声明为公有的方法 6 AppDelegate(); //构造函数 7 virtual ~AppDelegate(); //析构函数 8 virtual bool applicationDidFinishLaunching(); //初始化方法 9 virtual void applicationDidEnterBackground();
//当程序进入后台时调用此方法 10 virtual void applicationWillEnterForeground();
//当程序进入前台时调用此方法 11 void initMusic(); //加载背景音乐与音效的方法 12 };
13 #endif //头文件定义结束
说明: 该头文件中只对相应的方法进行了声明,有构造函数、析构函数、初始化的方法、程序进入后台和前台时系统需要调用的方法、以及加载背景音乐与音效的方法,。
(2头文件中方法的具体实现,在代码的实现中可以了解界面的创建过程, 其代码AppDelegate.cpp 。
1 ......//此处省略了一些导入头文件以及定义宏的代码 2 using namespace cocos2d; //使用命名空间
3 AppDelegate::AppDelegate(){} //构造函数 4 AppDelegate::~AppDelegate(){} //析构函数
5 / /初始化桌球游戏中的CCDirector 以及CCScene 6 bool AppDelegate::applicationDidFinishLaunching(){
7 CCDirector* pDirector = CCDirector::sharedDirector();
//获取CCDirector (导演) 8 CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();//获取CCEGLView
9 pDirector->setOpenGLView(pEGLView); //为导演设置绘制用pEGLView 10 pEGLView->setDesignResolutionSize //设置目标分辨率尺寸 11(designResolutionSize.width,designResolutionSize.height, kResolutionShowAll); 12 CCSize frameSize = pEGLView->getFrameSize(); //获取画面帧尺寸 13 std::string rDis(picResource.directory); //设置资源子目录序列 14 std::vector pathV(2); //声明列表 15 pathV.push_back(picResource.directory); //添加进列表 16 pathV.push_back(soundResource.directory); //添加进列表 17 CCFileUtils::sharedFileUtils()->setSearchPaths(pathV); //设置路径 18 initMusic(); //加载背景音乐 19 pDirector->setContentScaleFactor(1.0); //设置缩放因子 20 pDirector->setDisplayStats(false); //关闭FPS 显示 21 pDirector->setAnimationInterval(1.0 /60); //设置FPS ,标准值为1/60 22 SceneManager*bsm=new SceneManager (); //创建场景对象 23 bsm->createScene(); //创建场景
24 pDirector->runWithScene(tsm->loadScene); / /告诉导演使用那个场景 25 return true; 26 }
27 void AppDelegate::applicationDidEnterBackground(){
//当程序离开前台,进入后台时调用 28 CCDirector::sharedDirector()->stopAnimation(); //停止动画 29 //如果有声音的话要调用下面一句暂停声音播放 30 CocosDenshion::SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); 31 CocosDenshion::SimpleAudioEngine::sharedEngine()->pauseAllEffects(); //暂停所有音效 32 }
33 void AppDelegate::applicationWillEnterForeground(){ //当程序进入前台时调用 34 CCDirector::sharedDirector()->startAnimation(); //开始动画 35 //如果有声音的话要调用下面一句开始声音播放 36
CocosDenshion::SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic(); 37 CocosDenshion::SimpleAudioEngine::sharedEngine()->resumeAllEffects ();
//暂停所有音效 38 }
39 void AppDelegate::initMusic(){ //加载背景音乐的方法 40 CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic( 41 "sound/backsound.mp3" 42 ); 43 CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect( 44 "sound/ballin.mp3" 45 ); 46 CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect( 47 "sound/hit.mp3" 48 ); 49 CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect( 50 "sound/shoot.mp3" 51 ); 52 CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect( 53 "sound/win.mp3" 54 ); 55 CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect(
56 "sound/gameover.mp3" 57 ); 58 CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect( 59 "sound/win.mp3" 60 );}
说明:第7~9行为获取cocos2d-x 的导演以及绘制的view ,并将view 设置给导演,这样我们
就在屏幕中看到了绘制的画面。第10~11行为设置绘制的标准屏幕分辨率并设置自适应屏幕方案,如此开发的桌球游戏就可以运行在不同分辨率的手机上。第12~17行为获取画面帧的尺寸并为cocos2d-x 系统设置资源搜索路径,这样程序就会到指定的文件夹搜索图片资源、声音资源以及字体资源。第18~21行为首先调用initMusic 加载背景音乐、音效等,设置画面的缩放因子并关闭FPS
的显示。第22~24为创建场景,并调用导演类的runWithScene 方法运行当前创建的场景。第26~32行为当程序离开前台进入后台时的回调方法,停止动画并暂停声音与音效的播放。第33~38行为程序进入前台时的回调方法,开始动画并开始播放声音恢复音效播放。第39~60行为加载声音的initMusic 方法,主要是加载桌球游戏过程中的背景音乐以及音效等。 4.4桌球游戏界面展示
本桌球游戏中各个界面的构成、本桌球游戏的玩法以及各个按钮的具体功能,各个界面的实现,展示如下。
(1)运行本桌球游戏,首先进入桌球游戏的菜单界面,如图1-3所示,菜单界面中,点击“开始桌球游戏”按钮会进入桌球游戏模式选择场景;点击“关于”按钮进入关于界面,点击“帮助”按钮进入帮助界面;点击“设置”按钮会进入声音设置界面;点击“退出”按钮则退出桌球游戏。
图4-1菜单界面 图4-2关于界面
(2)当点击了菜单界面的“关于”按钮后,进入桌球游戏的关于界面,该界面介绍了桌球游戏的名称,版本号。
(3)当点击了菜单界面的“帮助”按钮后,进入桌球游戏的帮助界面,该界面介绍了桌球游戏的玩法,示意图如图1-5、1-6所示,点击“返回键”按钮返回菜单界面。
图4-3帮助界面 图4-4帮助界面
(4)点击菜单界面的“设置”按钮进入声音设置界面,如图1-7所示,点击设置界面的音乐开关按钮,能够进行背景音乐播放的控制,点击设置界面的音效开关按钮,能够进行桌球游戏过程中音效播放的控制,按下按返回键按钮,能够返回菜单界面。
图4-5设置界面
图4-6模式选择界面
(5)点击菜单界面的“开始桌球游戏”按钮进入桌球游戏模式选择界面,如图1-8所示,在该界面中从上到下共有三个按钮,依次为“倒计时模式”选择按钮,“练习模式”选择按钮,以及“排行榜”查看按钮,点击“倒计时模式”按钮进入倒计时模式,如图1-9所示,点击“练习模式”按钮进入练习模式如图1-10所示,点击“排行榜”查看按钮,进入到排行榜查看界面如图9-11所示,
图4-7倒计时模式界面 图4-8练习模式界面
(6)点击桌球游戏界面的“辅助线”按钮,能在母球将要击到的目标球的点绘制出该目标球的运动轨迹,如图1-12所示,点击桌球游戏界面的“Go ”按钮击打母球,通过调整右侧的能量条高度,调整击打母球的力度,点击左下角的微调按钮,精细调整球杆的角度。
图4-9排行榜查看界面 图4-10桌球游戏界面示意图
(7)当将花色球或者全色球全部打入洞中,并且最后黑色八号球进洞,会进入桌球游戏胜利界面,如图1-13,若首先打入洞的是花是球,再次打进全色球则桌球游戏失败,若花色球或者全色球未全部打入洞中,黑色八号球进洞则桌球游戏失败,进入桌球游戏失败界面,如图1-14所示
图4-11桌球游戏胜利界面图
图4-12桌球游戏失败界面
五. 结束语
到此为止,休闲类桌球——Billiard_2D已经基本开发完成,也实现了最初设计的功能。但是通过开发后的试玩测试发现,桌球游戏中仍然存在一些需要优化和改进的地方,下面列举笔者想到的一些方面。
(1)优化桌球游戏界面
没有哪一款桌球游戏的界面不可以更加的完美和绚丽,所以对本桌球游戏的界面,还可以自行根据自己的想法进行改进,使其更加完美。如桌球游戏场景的搭建、桌球的帧动画图片等都可以进一步的完善。
(2)修复桌球游戏bug
现在众多的手机桌球游戏在公测之后也有很多的bug ,需要玩家不断的发现以此来改进桌球游戏。比如本桌球游戏中在进行辅助刚体物理模拟的时候,桌球游戏会变的有些卡,虽然我们已经测试改进了大部分问题,但是还有很多bug 是需要玩家发现,这对于桌球游戏的可玩性有极其重要的帮助。
(3)增强桌球游戏体验
为了满足更好的用户体验,桌球进洞效果,辅助线的计算方法等细节等一系列参数读者可以自行调整,合适的参数会极大地增加桌球游戏的可玩性。
参考文献
【1】 (美) James Steele, Nelson To著. 李青, 王瑜, 赵丞兵译.Android 开发秘籍[M].北京:
人民邮电出版社,2011
【2】 朱桂英. Android开发应用从入门到精通[M]. 北京:中国铁道出版社,2011
【3】 吴亚峰, 苏亚光. Android 3D桌球游戏开发技术详解与典型案例[M]. 北京:电子工业
出版社,2011
【4】 李宁.Android 应用开发实战[M]. 北京:机械工业出版社,2012
【5】 杨丰盛. Android应用开发揭秘[M]. 北京:机械工业出版社,2010
【6】 (韩) 宋华燮. 桌球游戏角色设计[M]. 北京:人民邮电出版社,2011
【7】 火烈鸟网络科技. 著.Cocos2d-x 高级开发教程制作自己的《捕鱼达人》[M].人民邮电出
版社,2013
致 谢
我做毕业设计的这段时间是我学生生涯中最有价值的一段时光。这里有治学严谨而不失亲切的老师,有互相帮助的同学,更有积极向上、融洽的学习生活氛围。借此论文之际,我想向所有人表示我的谢意。
首先感谢我的指导教师闫敬老师,本论文是在闫老师的全面、具体的指导下修改完成的。在此,对老师的关心、指导和教诲表示由衷的感谢。老师追求真理、献身科学、严以律己、宽已待人的崇高品质对我将是永远的鞭策。
最后感谢我的同学们帮助我一起努力完成这款桌球游戏的制作;感谢这两年来传授给我知识的老师们;更感谢我的家人对我学业上的支持和鼓励;感谢所有关心帮助过我的人。同时感谢大学,感谢唐山师范学院。
The design and implementation of table tennis
game based on Android operating system
YangJinggang Directed By associate professor YanJing
Abstract With the leisure game on the Android platform has become increasingly rich,leisure table tennis game has become increasingly popular, this game is not only simple and full of difficult, often be the game enthusiasts, therefore, we will develop a Android platform based on 2D table tennis sport games -- (Billiard_2D),this game is a use of cocos2d-x combined with Box2d for image rendering Android platform of the leisure class table tennis game, this game uses cocos2d-x in a large number of special effects, greatly enriched the visual effects,enhancing the user experience, and physical simulation in this game to use the cocos2d-x to provide Box2d physics engine, table tennis is very real and cool.
Key words Android cocos2d-x Box2d game welcome