Cocos2d-x 3.X手游开发实例详解
Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048、卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰然网创始人杨雍力荐)
于浩洋 著
ISBN 978-7-121-23998-4
2014年9月出版
定价:59.00元
356页
16开
编辑推荐
以Cocos2d-x V3.0为框架全面讲解手游开发的知识和方法
以热门游戏2048、卡牌为例,完整再现手游的开发过程
Cocos2d-x作者之一林顺和泰然网创始人杨雍力荐
知识点深入浅出,实例丰富,代码完备
线上交流平台,及时答疑解惑
内容提要
《Cocos2d-x 3.X手游开发实例详解》以Cocos2d-x V3.0 系列版本为框架,通过实例讲解手机游戏的开发知识和方法,着重通过实例提高读者的开发动手能力。涉及的内容包括:环境搭建、交叉编译以及打包部署;Cocos2d-x数据类型和基本概念的使用,如场景、导演、精灵等;使用Cocos2d-x 创建用户界面,如文本、菜单、滚动框等基本控件,以及一些扩展控件的使用;使用Cocos2d-x 创建动作,比如让精灵移动、跳跃、旋转,以及如何创建按顺序或同时进行的动作;使用Cocos2d-x 播放、停止、暂停、继续播放背景音乐和音效;Cocos2d-x 使用的触摸事件机制;在游戏中存储数据的几种方式;使用HTTP、Sockets、WebSockets 进行网络编程;在游戏中使用物理引擎Box2D、使用瓷砖地图、使用CocosBuilder 制作游戏界面等;Cocos2d-x 中的纹理和动画。最后通过两个完整的游戏开发实例讲解使用Cocos2d-x 开发游戏的全过程。
《Cocos2d-x 3.X手游开发实例详解》实例丰富,代码完备,知识点清晰简洁。《Cocos2d-x 3.X手游开发实例详解》所有实例均提供完整代码下载,书后附有代码清单概要,非常方便读者查找使用。此外作者还将Cocos2d-x 3.X 各版本间的区别用实例做了详细说明,且将在博客不断更新。
《Cocos2d-x 3.X手游开发实例详解》适合对Cocos2d-x 感兴趣及有志于学习和从事移动平台游戏开发的读者阅读参考。
目录
第1章 准备 1
1.1 Cocos2d-x简介 1
1.2 Cocos2d-x架构和目录结构 6
1.3 环境搭建 7
1.3.1 Windows开发环境搭建 7
1.3.2 Mac开发环境搭建 11
1.3.3 创建新项目 12
1.3.4 在Android上调试项目 14
1.3.5 打包APK文件 22
第2章 Cocos2d-x常用数据和方法 23
2.1 C++数据类型 23
2.2 Cocos2d-x封装的数据类型 24
2.2.1 布尔型Bool的使用 24
2.2.2 整型Integer的使用 25
2.2.3 浮点型Double、Float的使用 25
2.2.4 字符串String的使用 25
2.2.5 数组Array的使用 26
2.2.6 点Point的使用 27
2.2.7 尺寸Size的使用 28
2.2.8 矩形Rect的使用 29
2.2.9 字典Dictionary的使用 31
2.3 常用宏定义 32
2.3.1 数学相关宏的使用 32
2.3.2 断言宏CCAsset的使用 33
2.3.3 数组遍历宏CCARRAY_FOREACH和CCARRAY_FOREACH_REVER SE的使用 33
2.3.4 字典遍历宏CCDICT_FOREACH的使用 35
2.3.5 对象创建方法宏CREATE_FUNC的使用 36
2.3.6 属性定义宏CC_PROPERTY的使用 37
2.3.7 命名空间宏 39
2.4 Cocos2d-x中的坐标和坐标系 39
2.4.1 OpenGL坐标系和屏幕坐标系 39
2.4.2 锚点和位置的使用 40
2.4.3 节点坐标系和世界坐标系的相互转换 42
第3章 Cocos2d-x核心概念 45
3.1 基础节点 46
3.1.1 Node简介 46
3.1.2 Node应用举例之移除节点 47
3.2 相机 47
3.2.1 相机简介 47
3.2.2 使用CCCamera循环缩放点 48
3.3 导演 49
3.3.1 导演Director简介 49
3.3.2 Director常用功能举例 50
3.4 场景 51
3.4.1 场景定义 51
3.4.2 创建显示战斗场景 52
3.4.3 动态切换多个场景 53
3.5 布景 56
3.5.1 布景定义 56
3.5.2 使用Layer模拟Windows Phone主界面 57
3.6 精灵 59
第4章 Cocos2d-x用户界面 61
4.1 文本渲染 61
4.1.1 制作fnt格式字体 62
4.1.2 使用LabelBMFont显示文本 66
4.1.3 使用LabelTTF显示文本 67
4.1.4 使用LabelAtlas显示文本 70
4.2 菜单 71
4.2.1 菜单和菜单项的简单使用 72
4.2.2 使用菜单制作游戏菜单功能 74
4.3 滚动框 80
4.3.1 使用ScrollView显示多页内容 80
4.3.2 监听ScrollView的滚动和缩放事件 82
4.3.3 使用TableView展示多页内容 83
4.3.4 触摸TableView里的菜单来滚动TableView 86
4.4 扩展控件 87
4.4.1 滑动条控件ControlSlider 87
4.4.2 开关控件ControlSwitch 90
4.4.3 取色器控件ControlColourPicker 92
4.4.4 电位计控件ControlPotentiometer 94
4.4.5 步进器控件ControlStepper 95
4.4.6 按钮控件ControlButton 96
4.4.7 Scale9Sprite 99
4.5 使用编辑框制作用户登录界面 100
第5章 Cocos2d-x动作 105
5.1 动作分类 105
5.2 瞬时动作 106
5.2.1 使用FlipX/FlipY实现X/Y翻转 106
5.2.2 使用Hide、Show实现隐藏和显示 108
5.3 延时动作 109
5.3.1 使用MoveTo或者MoveBy实现移动 109
5.3.2 使用RotateTo和RotateBy实现旋转 110
5.3.3 使用JumpTo和JumpBy实现跳跃 113
5.3.4 使用ScaleTo和ScaleBy实现缩放 114
5.3.5 使用SkewTo和SkewBy实现倾斜变形 115
5.3.6 使用CardinalSplineBy和CardinalSplineTo实现曲线运动 117
5.3.7 使用FadeIn和FadeOut实现渐隐渐出 119
5.4 联合动作 120
5.4.1 按先后顺序执行动作 120
5.4.2 同时执行动作 121
5.4.3 逆向执行动作 122
5.4.4 多次重复执行动作 123
5.4.5 延时执行动作 124
第6章 音频处理 125
6.1 音频处理类SimpleAudioEngine 125
6.2 添加控制背景音乐 126
6.2.1 播放背景音乐并调整音量 126
6.2.2 停止播放背景音乐 128
6.2.3 暂停播放背景音乐 128
6.2.4 继续播放背景音乐 128
6.3 添加控制音乐效果 129
6.3.1 播放音乐 129
6.3.2 停止播放音乐 131
6.3.3 暂停播放音乐 131
6.3.4 继续播放音乐 131
6.3.5 停止、暂停、继续播放所有音乐 132
6.4 Cocos2d-x支持的音频格式 133
第7章 Cocos2d-x瓷砖地图 135
7.1 什么是瓷砖地图 135
7.2 使用Tiled制作瓷砖地图 137
7.2.1 安装Tiled 137
7.2.2 制作地图 138
7.3 在游戏中使用瓷砖地图 140
7.3.1 使用TMXTiledMap把瓷砖地图加载到游戏中 140
7.3.2 拖曳TMX地图 141
7.3.3 在TMX地图中添加并移动精灵 142
7.3.4 读写TMX地图中的图层和瓷砖 143
第8章 Cocos2d-x中的事件机制 146
8.1 事件和事件调度 147
8.2 触摸事件 149
8.2.1 单点触摸事件的类和方法 149
8.2.2 单击屏幕移动精灵 150
8.2.3 拖动精灵移动 152
8.2.4 修改监听器的优先级 154
8.2.5 多点触摸事件 156
8.2.6 使用多点触摸实现缩放 157
8.3 鼠标事件 159
8.4 键盘事件 159
8.4.1 键盘事件介绍 159
8.4.2 实例:把键盘输入内容显示在屏幕中 160
8.5 加速计 161
8.5.1 加速计介绍 161
8.5.2 实例:利用加速计控制小球移动 162
第9章 Cocos2d-x本地数据存储 165
9.1 使用UserDefault存储数据 165
9.1.1 UserDefault介绍 165
9.1.2 使用UserDefault存储修改数据 167
9.2 文件 169
9.2.1 文件处理类FileUtils 169
9.2.2 判断文件是否存在 169
9.2.3 设置文件别名 170
9.2.4 获取文件完整路径 172
9.2.5 设置文件搜索路径 174
9.2.6 根据分辨率调用不同的资源 175
9.2.7 向文件中写入数据 176
9.2.8 从文件中读取数据 179
9.2.9 把数据写入plist文件 180
9.2.10 从plist文件读取数据 182
9.3 SQLite存储 183
9.3.1 SQLite简介 183
9.3.2 可视化管理工具SQLiteStudio 185
9.3.3 使用SQLiteStudio添加数据库 186
9.3.4 使用SQLiteStudio添加表和数据 188
9.3.5 使用C语言接口操作SQLite数据库 190
9.3.6 不使用回调查询SQLite数据库 194
第10章 网络编程 197
10.1 HTTP实现网络通信 198
10.1.1 HTTP通信简介及常用类 198
10.1.2 GET方式通信 200
10.1.3 POST方式通信 203
10.2 Socket实现网络通信 204
10.2.1 Socket简介 204
10.2.2 在Cocos2d-x中使用Socket 205
10.3 WebSocket实现网络通信 209
10.3.1 WebSocket简介 209
10.3.2 在Cocos2d-x中使用WebSocket 210
第11章 物理引擎Box2D 215
11.1 Box2D简介 216
11.2 创建Box2D的HelloWorld项目 217
11.2.1 创建一个世界 217
11.2.2 创建一个地面物体 217
11.2.3 创建一个动态物体 219
11.2.4 模拟(Box2D的)世界 219
11.2.5 清理工作 221
11.3 世界b2World 221
11.3.1 b2World简介 221
11.3.2 世界常用功能 222
11.4 物体b2Body 225
11.4.1 b2Body简介 225
11.4.2 物体定义 226
11.4.3 创建物体 228
11.4.4 使用物体 229
11.5 固定装置b2FixtureDef 231
11.5.1 b2FixtureDef简介 231
11.5.2 创建b2FixtureDef 231
11.6 关节 234
11.6.1 关节简介 234
11.6.2 关节定义 235
11.6.3 创建关节 235
11.6.4 关节类型和使用关节 236
11.7 接触 242
11.7.1 接触简介 242
11.7.2 接触监听器 243
11.7.3 接触筛选 244
第12章 纹理和动画 246
12.1 渲染和修改纹理 246
12.1.1 纹理类Texture2D 247
12.1.2 Cocos2d-x支持的纹理格式 249
12.1.3 Cocos2d-x支持的最大纹理尺寸 249
12.1.4 使用RenderTexture保存截屏 250
12.1.5 图片抗锯齿处理方式 251
12.1.6 使用图片缓存 253
12.1.7 制作游戏加载场景 254
12.1.8 使用TexturePacker制作Sprite Sheet 256
12.2 动画 258
12.2.1 帧动画 258
12.2.2 使用帧动画实现英雄打斗 259
12.2.3 Sprite Sheet动画 266
12.2.4 骨骼动画 268
12.2.5 使用CocoStudio制作骨骼动画 269
12.2.6 在项目中调用CocoStudio制作的骨骼动画 273
第13章 使用Cocos2d-x制作2048休闲游戏 275
13.1 准备工作 275
13.2 使用CocoStudio制作UI界面 276
13.3 编写逻辑代码 279
13.3.1 把UI界面添加到游戏界面中 279
13.3.2 添加获取分数控件并设置分数 281
13.3.3 添加数字方块类 281
13.3.4 初始化游戏数据 282
13.3.5 添加按钮功能 284
13.3.6 添加事件监听 285
13.3.7 实现方块上下左右移动 287
13.3.8 添加新的数字块 290
13.3.9 判断游戏是否结束 291
13.3.10 添加游戏介绍界面 293
第14章 使用Cocos2d-x制作水浒卡牌游戏 294
14.1 准备工作 294
14.2 定义游戏数据结构和存储单例 295
14.3 添加登录界面 299
14.4 添加游戏主场景 305
14.5 添加游戏首页 307
14.6 添加英雄卡牌列表界面 311
14.7 添加战斗流程 314
14.8 添加战斗界面 319
14.9 终结 323
附录A 实例代码清单说明 324
附录B Cocos2d-x 3.X主要版本间的区别 328
精彩节摘
14.7 添加战斗流程
战斗是卡牌游戏的灵魂,有了喜欢的英雄,给英雄装备一套好的装备,这时不拿出来用用多没意思啊!战斗让你的英雄久经沙场,变得更强更伟大。该游戏中的战斗流程是,单击战争菜单,首先进入世界地图,如图14-5所示,单击世界地图上的某个势力范围,进入该势力范围的推图,再单击其中一个推图进入战斗场景。
世界地图通过GameMapLayer实现。在GameMapLayer初始化中,添加一个ScrollView,用来滚动显示隐藏的地图:
ui::ScrollView* dragPanel = ui::ScrollView::create();
设置dragPanel的大小为窗口大小:
Size widgetSize =Director::getInstance()->getWinSize();
dragPanel->setSize(widgetSize);
设置dragPanel的内容大小为640×1920:
Size backgroundSize = Size(640,1920);
dragPanel->setInnerContainerSize(backgroundSize);
设置位置添加到场景中:
dragPanel->setPosition(ccp((widgetSize.width - backgroundSize.width) / 2, (widgetSize.height - backgroundSize.height) / 2 +
(backgroundSize.height - dragPanel->getContentSize().height) / 2));
m_pLayer->addChild(dragPanel);
世界地图是用CocosStudio制作的UI,这里省略详细的制作过程,因为上一个实例已经详细讲解了CocosStudio怎制作UI。我们把UI添加到dragPanel中:
Layout* map_root = dynamic_cast<Layout*>(GUIReader::shareReader()->widgetFromJsonFile("GameMapLayer_1.json"));
dragPanel->addChild(map_root);
然后定义一个数组,代表势力范围的名称:
string str[21] = {"yananfu","shijiachun","shimiao","yezhulin", "changzhou","hunxian","erlongsan","qingzhou","jiangzhou","liangsan","zhujiazhuang","beijing","chengtou","dongpingfu","dongjing","liangsan","jizhou","shuzhou","hangzhou","guanfu"};
通过一个for循环遍历UI地图中的Button,并为Button添加名称和回调函数:
for (unsigned int i = 0; i<20; ++i)
{
Button* button = (Button*)(map_root->getChildByTag(i));
button->setTitleFontSize(32);
button->setTitleColor(Color3B(255,0,0));
button->setTitleText(str[i].c_str());
button->addTouchEventListener(this,toucheventselector (GameMapLayer::buttonTouchEvent));
}
在回调函数buttonTouchEvent中,先获取单击Button的tag和现在的等级:
voidGameMapLayer::buttonTouchEvent(Ref *pSender, TouchEventType type)
{
Size winSize =Director::getInstance()->getWinSize();
Sprite *bg=Sprite::create("tipbg.png");
Button* pHome=(Button*)pSender;
int tag=pHome->getTag();
int level=GameData::shareGameData()->mlevel;
switch (type)
{
case TOUCH_EVENT_BEGAN:
break;
case TOUCH_EVENT_MOVED:
break;
case TOUCH_EVENT_ENDED:
....进行操作....
break;
case TOUCH_EVENT_CANCELED:
break;
default:
break;
}
}
然后在TOUCH_EVENT_ENDED中判断等级是否大于等于tag*5-10,如果是就进入推图场景:
if(level>=tag*5-10)
{
FightLayer *info=new FightLayer(tag);
addChild(info);
}
这时,运行程序,单击世界地图中最上面的势力,进入推图场景,如图14-6所示。
作者简介
于浩洋:曾就职于阿里巴巴、人人网,从事多年互联网产品开发工作。守望科技工作室创始人,我博轻游科技有限责任公司CTO,参与主导多款卡牌手游的开发与发行,有丰富的手游开发经验。
媒体评论
手游是个很有前景的行业,同时也是个竞争异常激烈的行业。为了在竞争中立于不败之地,必须有可靠先进的技术和技术人才。此书以Cocos2d-x 3.0为基础,从入门知识到高级进阶,详细讲解了手游开发的十几个大模块,每个大模块又包含了许多小的知识点,是提高技术水平不可多得的一本书。
林顺
触控科技高级技术总监,Cocos2d-js作者
本书是由从业多年的开发者于浩洋所著,多年的互联网巨头从业经验使得作者形成了比较扎实的知识体系。书中对基础知识娓娓道来,同时全书包括多个实例讲解。大量的实例,让所有知识深入浅出,不论你是有从业经验的中级开发者还是初次使用Cocos2d-x的小白用户,本书都是不错的选择。
杨雍
泰然网创始人,Cocos2d-x技术推广总监
前言
记得第一次接触移动互联网是在2008年左右,当时互联网应用相当普及,市场竞争进入红海,绝大多数人认为移动互联将成为下一个增长点,是很大的蓝海,社会将进入3G时代。大到三大运营商和一线互联网公司,小到小公司和个人开发者都想进入移动互联,从3G大蛋糕中分到一块利益。转眼几年过去,正如当时预料的那样,移动互联已经深入人们的生活当中,4G也悄悄来临。在移动互联的发展过程中,苹果公司起到了不可磨灭的作用,因为它发布了能承载移动互联功能的新概念智能手机iPhone。于是乎,诞生了一大批移动应用和移动游戏的开发商和个人开发者。其中以《疯狂的小鸟》为代表的第一批手机游戏进入人们的视线并大获成功,之后手机游戏以比雨后春笋还疯狂很多倍的速度成长起来。各种类型的游戏出现在市场中,例如《我叫MT》《大掌门》《找你妹》及腾讯的天天游戏系列。
在手机游戏快速成长的过程中,手机游戏开发框架也跟着发展起来,其中最著名的就是Cocos2d家族,Cocos2d-iphone、Cocos2d-js、Cocos2d-java等,其中Cocos2d-iphone使用数最多。但是Cocos2d-iphone是用Objective-C开发的,只能用于开发iPhone平台的游戏,如果想发布到Android平台,就要使用另外一种语言,几乎重写所有代码。于是,中国有位叫王哲的“大神”,使用C++重新实现了一遍Cocos2d-iphone的API,使用C++开发的游戏不仅效率高,也能发布到iOS、Android、in、Linux等多个平台,真正实现了编写一次、多平台运行的目的。
Cocos2d-x 3.0系列统一修改了类和接口(比如把类前面的CC去掉),使代码更规范、更美观。3.0系列重写了纹理渲染方式,不再会产生成倍消耗内存的情况,使游戏运行效率更高、更稳定。本书以Cocos2d-x 3.0版本为基础,记录整理了笔者在学习和使用Cocos2d-x中遇到的问题和常用功能,以实践为主,着重提高读者的动手开发能力,让读者从入门手游的菜鸟成为游戏开发界的大神。
本书的主要内容如下。
第1章介绍Cocos2d-x的优缺点和目录结构,本书案例需要的环境搭建、交叉编译以及打包部署。
第2章讲解了Cocos2d-x中常用的数据类型和方法及一些宏定义。
第3章讲解了Cocos2d-x的基本概念,即基础节点Node、相机、导演、场景、布景、精灵。
接着由浅入深,第4章讲解了如何使用Cocos2d-x创建用户界面,如文本、菜单、滚动框等基本控件,以及一些扩展控件,如取色器、计步器、复选框等。
之后笔者用很多篇幅在第5章讲解了使用Cocos2d-x创建动作的方式,因为动作在游戏中是必不可少的重中之重,内容包括移动、跳跃、旋转等简单动作,以及按顺序执行或同时执行的复杂动作。
音乐在游戏中也不可或缺,好的音效给人耳目一新的感觉,本书第6章讲解了使用Cocos2d-x播放、停止、暂停、继续播放背景音乐和音效。
第7章介绍了瓷砖地图相关的内容,包括瓷砖地图的概念、如何制作瓷砖地图,如何在游戏中使用、操作瓷砖地图等。
第8章讲解了Cocos2d-x中的事件机制,包括触摸事件、鼠标事件、键盘事件,以触摸事件为主要内容。智能手机大多数都是触摸屏,要监听用户的触摸行为,然后调用相应的行为动作,Cocos2d-x提供了一套触摸事件机制,并且3.0系统重写了该机制,使监听用户触摸行为更加方便快捷,同时Cocos2d-x还支持多点触摸机制,增加玩家与手机的交互乐趣。
除此之外,进行游戏时还产生很多数据,这些数据有时需要保存下来以便下次使用,所以第9章介绍了多种保存数据的方式,比如UsderDefault、Plist、本地数据库SQLite等。
当开发网络游戏时,客户端要不断地跟服务端进行数据交换,第10章讲解了如何使用HTTP、Sockets、WebSockets进行网络编程。
第11章介绍了物理引擎,它可以使游戏更加接近现实世界,给玩家更真实的体验。
第12章讲解了纹理和动画,介绍了纹理的渲染方式并提供了几个提高渲染效率的方法。动画部分讲解了如何在游戏中播放帧动画、plist动画和骨骼动画。书中还穿插介绍了一些工具的使用方法,比如使用bitmap font generator制作自定义字体,使用Tiled Map Editor制作编辑瓷砖地图,使用SQLiteStudio管理SQLite数据库,使用CocoStudio制作编辑UI、动画、场景等。
第13章讲解了休闲游戏2048的完整开发过程,核心内容包括使用CocoStudio制作UI界面,UI界面与逻辑代码的交互,使用UserDefault存取游戏数据,数字方块移动、合并的逻辑等。
第14章讲解了水浒卡牌游戏的完整开发过程,挑选了其中几个典型的功能进行了详细讲解,包括登录界面、公共菜单、游戏首页、英雄列表、地图、推图和战斗界面等。本章内容对于游戏开发人员具有很高的参考价值。
本书所有实例代码在附录A中有详细说明,读者可到博文视点网站下载,地址:www.broadview.com.cn/23998。
附录B详细介绍了Cocos2d-x 3.X主要版本间的区别,用实例详细说明各个功能点的使用方法。
最后衷心感谢读者的支持,如果有问题或想法可以到博客上留言交流,我的博客是http://blog.watchtech.net。
于浩洋