第一篇 开发基础 2
第1章 准备开始 2
1.1 本书学习路线图 2
1.2 使用实例代码 3
第2章 Cocos2d-x简介与环境搭建 5
2.1 移动平台游戏引擎简介 5
2.2 Cocos2d家谱 5
2.3 Cocos2d-x设计目标 6
2.4 在Windows平台下开始开发Cocos2d-x游戏 8
2.4.1 使用Visual Studio开发工具 8
2.4.2 下载和使用Cocos2d-x案例 9
2.4.3 生成API文档 10
本章小结 18
第3章 Hello Cocos2d-x 19
3.1 第一个Cocos2d-x游戏 19
3.1.1 创建工程 19
3.1.2 工程文件结构 21
3.1.3 代码解释 22
3.2 Cocos2d-x核心概念 28
3.2.1 导演 28
3.2.2 场景 28
3.2.3 层 28
3.2.4 精灵 31
3.2.5 菜单 31
3.3 Node与Node层级架构 32
3.3.1 Node中重要的操作 32
3.3.2 Node中重要的属性 34
3.3.3 游戏循环与调度 36
3.4 Cocos2d-x坐标系 37
3.4.1 UI坐标 38
3.4.2 OpenGL坐标 38
3.4.3 世界坐标和模型坐标 38
3.5 Win32平台下设置屏幕 43
本章小结 43
第4章 字符串、标签和菜单 44
4.1 Cocos2d-x中的字符串 44
4.1.1 使用const char*和std::string 44
4.1.2 使用cocos2d::__String 45
4.1.3 Win32平台下中文乱码问题 46
4.2 使用标签 47
4.2.1 LabelTTF 47
4.2.2 LabelAtlas 49
4.2.3 LabelBMFont 50
4.2.4 Cocos2d-x3.x标签类Label 51
4.2.5 标签中文乱码问题 54
4.3 使用菜单 57
4.3.1 文本菜单 58
4.3.2 精灵菜单和图片菜单 60
4.3.3 开关菜单 62
本章小结 64
第5章 精灵 65
5.1 Sprite精灵类 65
5.1.1 创建Sprite精灵对象 65
5.1.2 实例:使用纹理对象创建Sprite对象 66
5.2 精灵的性能优化 67
5.2.1 使用纹理图集 68
5.2.2 使用精灵帧缓存 70
本章小结 73
第6章 场景与层 74
6.1 场景与层的关系 74
6.2 场景切换 75
6.2.1 场景切换相关函数 75
6.2.2 场景过渡动画 80
6.3 场景的生命周期 82
6.3.1 生命周期函数 82
6.3.2 多场景切换生命周期 83
本章小结 85
第7章 动作、特效和动画 86
7.1 动作 86
7.1.1 瞬时动作 87
7.1.2 间隔动作 92
7.1.3 组合动作 100
7.1.4 动作速度控制 105
7.1.5 函数调用 111
7.2 特效 116
7.2.1 网格动作 116
7.2.2 实例:特效演示 116
7.3 动画 122
7.3.1 帧动画 122
7.3.2 实例:帧动画使用 122
本章小结 125
第8章 Cocos2d-x用户事件 126
8.1 事件处理机制 126
8.1.1 事件分发器 127
8.1.2 触摸事件 128
8.1.3 实例:单点触摸事件 129
8.1.4 实例:使用Lambda表达式 134
8.1.5 键盘事件 136
8.1.6 鼠标事件 137
8.2 在层中进行事件处理 138
8.2.1 触摸事件 139
8.2.2 实例:单点触摸事件 140
8.3 加速度计与加速度事件 143
8.3.1 加速度计 143
8.3.2 使用事件分发器 144
8.3.3 使用层加速度计事件 145
8.3.4 实例:运动的小球 145
本章小结 148
第二篇 开发进阶 150
第9章 游戏背景音乐与音效 150
9.1 Cocos2d-x中的音频文件 150
9.1.1 音频文件简介 150
9.1.2 Cocos2d-x跨平台音频支持 151
9.2 使用CocosDenshion引擎 152
9.2.1 音频文件的预处理 152
9.2.2 播放背景音乐 153
9.2.3 停止播放背景音乐 155
9.2.4 背景音乐播放暂停与继续 156
9.3 实例:设置背景音乐与音效 157
9.3.1 AppDelegate实现 157
9.3.2 HelloWorld场景实现 159
9.3.3 设置场景实现 162
本章小结 166
第10章 粒子系统 167
10.1 问题的提出 167
10.2 粒子系统基本概念 168
10.2.1 实例:打火机 168
10.2.2 粒子发射模式 169
10.2.3 粒子系统属性 169
10.3 Cocos2d-x内置粒子系统 173
10.3.1 内置粒子系统 173
10.3.2 实例:内置粒子系统 173
10.4 自定义粒子系统 177
10.4.1 代码创建 177
10.4.2 plist文件创建 180
本章小结 183
第11章 瓦片地图 184
11.1 地图性能问题 184
11.2 Cocos2d-x中瓦片地图API 186
11.3 实例:忍者无敌 187
11.3.1 设计地图 188
11.3.2 程序中加载地图 189
11.3.3 移动精灵 190
11.3.4 检测碰撞 192
11.3.5 滚动地图 198
本章小结 200
第12章 物理引擎 201
12.1 使用物理引擎 202
12.1.1 物理引擎核心概念 202
12.1.2 物理引擎与精灵关系 202
12.2 Cocos2d-x3.x中物理引擎封装 204
12.2.1 Cocos2d-x3.x物理引擎API 204
12.2.2 实例:HelloPhysicsWorld 207
12.2.3 实例:碰撞检测 211
12.2.4 实例:使用关节 215
12.3 Box2D引擎 217
12.3.1 Box2D核心概念 217
12.3.2 使用Box2D物理引擎的一般步骤 217
12.3.3 Visual Studio 2012下Box2D开发环境设置 218
12.3.4 实例:HelloBox2D 219
12.3.5 实例:碰撞检测 225
12.3.6 实例:使用关节 229
本章小结 232
第三篇 数据与网络 234
第13章 Cocos2d-x中使用的数据容器类 234
13.1 Cocos2d-x中两大类——Ref和Value 234
13.1.1 Cocos2d-x根类Ref 235
13.1.2 包装类Value 236
13.2 Ref列表容器 237
13.2.1 _Array容器 237
13.2.2 实例:_Array容器 238
13.2.3 Vector<T>容器 241
13.2.4 实例:Vector<T>容器 243
13.3 Ref字典容器 245
13.3.1 _Dictionary容器 246
13.3.2 实例:Dictionary容器 247
13.3.3 Map<K,V>容器 251
13.3.4 实例:Map<K,V>容器 252
13.4 Value列表容器——ValueVector 255
13.4.1 ValueVector常用API 255
13.4.2 实例:使用ValueVector容器 256
13.5 Value字典容器——ValueMap和ValueMapIntKey 258
13.5.1 ValueMap和ValueMapIntKey常用API 258
13.5.2 实例:使用ValueMap容器 259
本章小结 262
第14章 数据持久化 263
14.1 使用FileUtils访问文件 263
14.1.1 Cocos2d-x中的目录 263
14.1.2 实例:文件读写 265
14.1.3 实例:路径搜索 268
14.2 持久化简介 270
14.3 UserDefault数据持久化 270
14.3.1 UserDefaultAPI 271
14.3.2 实例:保存背景音乐和音效设置 272
14.4 属性列表数据持久化 279
14.4.1 属性列表简介 279
14.4.2 实例:MyNotes 281
14.4.3 使用_Dictionary读写属性列表文件 282
14.4.4 使用ValueMap读写属性列表文件 286
14.4.5 使用ValueVector读取属性列表文件 289
14.5 SQLite数据库数据持久化 292
14.5.1 SQLite数据库简介 292
14.5.2 Visual Studio下SQLite数据库开发环境设置 293
14.5.3 实例:重构MyNotes 296
14.5.4 创建数据库 297
14.5.5 SQLite数据库管理工具 299
14.5.6 查询数据 301
14.5.7 修改数据 304
本章小结 307
第15章 数据交换格式 308
15.1 CSV数据交换格式 310
15.1.1 文档结构 310
15.1.2 CSV格式解码 311
15.2 XML数据交换格式 315
15.2.1 文档结构 315
15.2.2 SAX解析 317
15.2.3 DOM解析 324
15.3 JSON数据交换格式 330
15.3.1 文档结构 330
15.3.2 JSON框架jsoncpp和rapidjson比较 331
15.3.3 实例:rapidjson解码 331
15.3.4 实例:rapidjson编码 337
本章小结 341
第16章 基于HTTP的网络通信 342
16.1 网络结构 342
16.1.1 客户端服务器结构网络 342
16.1.2 对等结构网络 342
16.2 HTTP与HTTPS 343
16.3 使用cURL开发客户端 344
16.3.1 cURL与libcurl库 344
16.3.2 Visual Studio下libcurl库开发环境设置 344
16.3.3 实例:重构MyNotes 345
16.4 使用HttpClient开发客户端 354
16.4.1 HttpClient API 354
16.4.2 Visual Studio下HttpClient开发环境设置 355
16.4.3 实例:重构MyNotes 357
本章小结 363
第17章 基于Node.js的Socket.IO网络通信 364
17.1 Node.js简介 364
17.1.1 Node.js安装 364
17.1.2 Node.js测试 365
17.2 使用Socket.IO 366
17.2.1 Socket.IO服务器端开发 367
17.2.2 Cocos2d-x的Socket.IO客户端 369
17.3 实例:Socket.IO重构MyNotes 375
17.3.1 Socket.IO服务器端开发 376
17.3.2 Node.js访问SQLite数据库 377
17.3.3 Cocos2d-x的Socket.IO客户端开发 380
本章小结 386
第四篇 设计与优化 388
第18章 Cocos2d-x中常用的设计模式 388
18.1 单例设计模式 389
18.1.1 问题提出 389
18.1.2 实现原理 389
18.1.3 应用案例 390
18.2 委托设计模式 390
18.2.1 问题提出 391
18.2.2 实现原理 391
18.2.3 应用案例 392
18.3 观察者设计模式与通知机制 396
18.3.1 问题提出 396
18.3.2 实现原理 396
18.3.3 通知机制 397
本章小结 401
第19章 Cocos2d-x中的内存管理 402
19.1 C++内存管理 402
19.1.1 内存分配区域 402
19.1.2 动态内存分配 403
19.2 Ref内存管理 406
19.2.1 内存引用计数 406
19.2.2 自动释放池 407
19.2.3 Ref内存管理规则 410
19.3 Ref内存管理设计模式 412
19.3.1 使用静态构造函数 412
19.3.2 使用访问器 415
19.4 其他类型内存管理 420
19.4.1 Value内存管理 420
19.4.2 Vector<T>和Map<K,V>内存管理 420
本章小结 420
第20章 性能优化 421
20.1 工具 421
20.1.1 使用Xcode中Instruments工具 421
20.1.2 使用Windows任务管理器 426
20.1.3 使Visual Studio内存泄漏检测工具Visual Leak Detector 428
20.1.4 左下角的文字是什么 431
20.2 使用SpriteBatchNode批次渲染 433
20.3 合理使用缓存 434
20.3.1 场景与资源 435
20.3.2 缓存创建和清除时机 436
20.4 网片与纹理优化 438
20.4.1 选择图片格式 438
20.4.2 拼图 439
20.4.3 纹理像素格式 440
20.4.4 纹理缓存异步加载 441
20.4.5 背景图片优化 444
20.5 声音优化 446
20.5.1 声音格式优化 446
20.5.2 声音预处理与清除 447
20.6 多线程并发访问 448
20.6.1 std::thread多线程技术 448
20.6.2 异步预处理声音 449
20.7 SQLite数据库优化 451
20.7.1 表结构优化 451
20.7.2 查询优化 451
20.7.3 插入(或删除)优化 452
20.8 数据交换格式优化 452
本章小结 455
第五篇 平台移植 458
第21章 从Win32到Android平台的移植 458
21.1 搭建交叉编译和打包环境 458
21.1.1 安装Android SDK 460
21.1.2 管理Android SDK 462
21.1.3 管理Android开发模拟器 463
21.1.4 安装Android NDK 465
21.1.5 设置环境变量 466
21.2 交叉编译、打包和运行 467
21.2.1 使用cocos命令行工具 467
21.2.2 Android.mk编译文件 468
21.2.3 使用Eclipse工具 469
21.3 移植问题汇总 473
21.3.1 中文乱码问题 473
21.3.2 SQLite3数据库移植问题 474
21.3.3 JSON框架rapidjson移植问题 475
21.3.4 libcurl库移植问题 476
21.3.5 libNetwork库移植问题 478
21.3.6 横屏与竖屏设置问题 479
本章小结 480
第22章 从Win32到Windows Phone8平台的移植 481
22.1 Windows Phone8开发环境搭建 481
22.1.1 安装Windows Phone SDK8.0 481
22.1.2 安装Visual Studio Express 2012 for Windows Phone8 483
22.2 Cocos2d-x3.x的Windows Phone8工程 484
22.2.1 生成工程 484
22.2.2 运行工程 485
22.2.3 调试工程 486
22.3 移植问题汇总 487
22.3.1 中文乱码问题 487
22.3.2 SQLite3数据库移植问题 489
22.3.3 JSON框架rapidjson移植问题 492
22.3.4 libcurl库移植问题 492
22.3.5 libNetwork库移植问题 494
22.3.6 横屏与竖屏设置问题 497
本章小结 499
第23章 从Win32到iOS平台的移植 500
23.1 iOS开发环境搭建 500
23.1.1 Xcode安装和卸载 500
23.1.2 Xcode操作界面 501
23.2 从Visual Studio工程到Xcode工程 504
23.2.1 添加源文件 504
23.2.2 添加资源文件 505
23.2.3 Xcode中编译并运行 508
23.3 移植问题汇总 509
23.3.1 中文乱码问题 509
23.3.2 SQLite3数据库移植问题 510
23.3.3 JSON框架rapidjson移植问题 512
23.3.4 libcurl库移植问题 512
23.3.5 声音移植问题 514
23.3.6 使用PVR纹理格式 515
23.3.7 横屏与竖屏设置问题 516
23.4 多分辨率屏幕适配 518
23.4.1 问题的提出 518
23.4.2 Cocos2d-x屏幕适配 519
23.4.3 分辨率策略 521
23.4.4 纹理图集资源适配 524
23.4.5 瓦片地图资源适配 526
本章小结 526
第六篇 开发实践 528
第24章 使用Git管理程序代码版本 528
24.1 代码版本管理工具——Git 528
24.1.1 版本控制历史 528
24.1.2 术语和基本概念 529
24.1.3 Git环境配置 529
24.1.4 Git常用命令 530
24.2 代码托管服务——GitHub 533
24.2.1 创建和配置GitHub账号 533
24.2.2 创建代码库 536
24.2.3 删除代码库 536
24.2.4 派生代码库 539
24.2.5 GitHub协同开发 541
24.3 实例:Cocos2d-x游戏项目协同开发 542
24.3.1 提交到GitHub代码库 542
24.3.2 克隆GitHub代码库 545
24.3.3 重新获得GitHub代码库 545
本章小结 546
第25章 Cocos2d-x敏捷开发项目实战——迷失航线手机游戏 547
25.1 迷失航线游戏分析与设计 547
25.1.1 迷失航线故事背景 547
25.1.2 需求分析 547
25.1.3 原型设计 548
25.1.4 游戏脚本 549
25.2 任务1:游戏工程的创建与初始化 550
25.2.1 迭代1.1:创建工程 550
25.2.2 迭代1.2:多分辨率支持 550
25.2.3 迭代1.3:通用类与基类维护 551
25.2.4 迭代1.4:发布到GitHub 555
25.3 任务2:创建Loading场景 555
25.3.1 迭代2.1:添加场景和层 555
25.3.2 迭代2.2:Loading动画 557
25.3.3 迭代2.3:异步加载纹理缓存 557
25.3.4 迭代2.4:异步预处理声音 559
25.4 任务3:创建Home场景 560
25.4.1 迭代3.1:添加场景和层 560
25.4.2 迭代3.2:添加菜单 562
25.5 任务4:创建设置场景 563
25.6 任务5:创建帮助场景 565
25.7 任务6:游戏场景实现 568
25.7.1 迭代6.1:创建敌人精灵 568
25.7.2 迭代6.2:创建玩家飞机精灵 573
25.7.3 迭代6.3:创建炮弹精灵 576
25.7.4 迭代6.4:初始化游戏场景 578
25.7.5 迭代6.5:游戏场景菜单实现 581
25.7.6 迭代6.6:玩家飞机发射炮弹 584
25.7.7 迭代6.7:炮弹与敌人的碰撞检测 584
25.7.8 迭代6.8:玩家飞机与敌人的碰撞检测 588
25.7.9 迭代6.9:玩家飞机生命值显示 590
25.7.10 迭代6.10:显示玩家得分情况 591
25.8 任务7:游戏结束场景 591
本章小结 592
第26章 为迷失航线游戏添加广告 593
26.1 使用谷歌AdMob广告 593
26.1.1 注册AdMob账号 593
26.1.2 管理AdMob广告 593
26.1.3 AdMob广告类型 597
26.1.4 下载谷歌AdMob Ads SDK 597
26.2 为迷失航线游戏Android平台添加AdMob广告 599
26.2.1 Cocos2d-x引擎Android平台下AdMob开发环境搭建 599
26.2.2 编写AdMob相关代码 602
26.2.3 交叉编译与打包运行 606
26.3 为迷失航线游戏Windows Phone8平台添加AdMob广告 607
26.3.1 Cocos2d-x引擎Windows Phone8平台下AdMob开发环境搭建 607
26.3.2 编写AdMob相关代码 611
26.4 为迷失航线游戏iOS平台添加AdMob广告 614
26.4.1 Cocos2d-x引擎iOS平台下AdMob开发环境搭建 614
26.4.2 编写AdMob相关代码 616
本章小结 621
第27章 把迷失航线游戏发布到Google Play应用商店 622
27.1 谷歌Android应用商店Google Play 622
27.2 Android设备测试 623
27.3 还有“最后一公里” 624
27.3.1 添加图标 624
27.3.2 应用程序打包 625
27.4 发布产品 628
27.4.1 上传APK 628
27.4.2 填写商品详细信息 630
27.4.3 添加定价和发布范围 632
本章小结 634
第28章 把迷失航线游戏发布到Windows Phone应用商店 635
28.1 微软Windows Phone应用商店 635
28.2 Windows Phone8设备测试 636
28.2.1 播放音频时程序崩溃问题 636
28.2.2 屏幕分辨率宽度和高度相反问题 637
28.3 还有“最后一公里” 639
28.3.1 使用应用商店测试套件完成“最后一公里” 639
28.3.2 测试应用程序包XAP 640
28.3.3 修改应用程序的基本属性 642
28.3.4 配置图标 642
28.3.5 应用商店磁贴和屏幕快照 644
28.3.6 修改UI相关描述信息 644
28.3.7 修改打包信息 645
28.4 发布产品 646
28.4.1 填写应用信息 647
28.4.2 上传并描述您的程序包 651
本章小结 655
第29章 把迷失航线游戏发布到苹果App Store应用商店 656
29.1 苹果的App Store 656
29.2 iOS设备测试 658
29.2.1 创建开发者证书 658
29.2.2 设备注册 661
29.2.3 创建APP ID 664
29.2.4 创建配置概要文件 667
29.2.5 设备上运行 671
29.3 还有“最后一公里” 673
29.3.1 添加图标 673
29.3.2 添加启动界面 674
29.3.3 修改发布产品属性 675
29.3.4 为发布进行编译 676
29.3.5 应用打包 681
29.4 发布产品 682
29.4.1 创建应用及基本信息 682
29.4.2 应用定价信息 685
29.4.3 基本信息输入 685
29.4.4 上传应用前准备 690
29.4.5 上传应用 692
29.5 常见审核不通过的原因 695
29.5.1 功能问题 695
29.5.2 用户界面问题 695
29.5.3 商业问题 695
29.5.4 不当内容 696
29.5.5 其他问题 696
本章小结 696