第1篇 实用技术篇
第1章 文件读写
1.1 使用UserDefault
1.2 读写XML文件
1.2.1 XML格式简介
1.2.2 使用TinyXML读取XML
1.2.3 使用TinyXML写入XML
1.3 读写Plist文件
1.3.1 Plist格式简介
1.3.2 读写Plist文件
1.4 读取CSV文件
1.4.1 解析CSV
1.4.2 描述复杂结构
1.5 读写二进制文件<p>第1篇 实用技术篇</p> <p>第1章 文件读写</p> <p>1.1 使用UserDefault</p> <p>1.2 读写XML文件</p> <p>1.2.1 XML格式简介</p> <p>1.2.2 使用TinyXML读取XML</p> <p>1.2.3 使用TinyXML写入XML</p> <p>1.3 读写Plist文件</p> <p>1.3.1 Plist格式简介</p> <p>1.3.2 读写Plist文件</p> <p>1.4 读取CSV文件</p> <p>1.4.1 解析CSV</p> <p>1.4.2 描述复杂结构</p> <p>1.5 读写二进制文件</p> <p>第2章 加密解密</p> <p>2.1 加密解密基础</p> <p>2.1.1 公钥/私钥与非对称加密</p> <p>2.1.2 信息摘要与数字签名</p> <p>2.1.3 数字证书</p> <p>2.2 防止内存修改</p> <p>2.3 对资源的加密解密</p> <p>2.3.1 使用TexturePacker加密纹理</p> <p>2.3.2 对Lua脚本进行加密</p> <p>2.3.3 自定义Lua脚本加密解密</p> <p>2.3.4 自定义图片加密解密</p> <p>2.4 使用加固工具</p> <p>2.4.1 360加固保加固步骤</p> <p>2.4.2 Android应用签名</p> <p>第3章 增量更新</p> <p>3.1 使用AssetsManagerEx</p> <p>3.2 搭建增量更新服务器</p> <p>3.3 Manifest文件详解</p> <p>3.4 AssetsManagerEx内部实现流程简析</p> <p>3.5 自动打包工具</p> <p>第4章 声音与音效</p> <p>4.1 选择音频格式</p> <p>4.2 使用SimpleAudioEngine</p> <p>4.3 使用AudioEngine</p> <p>4.4 声音音效相关的经验和技巧</p> <p>第5章 分辨率适配</p> <p>5.1 Cocos2d-x适配策略</p> <p>5.1.1 分辨率适配策略</p> <p>5.1.2 坐标编码</p> <p>5.1.3 OpenGL窗口与可视化窗口</p> <p>5.1.4 setDesignResolutionSize详解</p> <p>5.2 分辨率适配经验</p> <p>5.2.1 宽度或高度锁定</p> <p>5.2.2 计算设计分辨率</p> <p>5.2.3 场景固定内容</p> <p>5.2.4 经验小结</p> <p>5.3 CocoStudio分辨率适配</p> <p>第6章 CocoStudio*佳实践</p> <p>6.1 **创建CSB</p> <p>6.1.1 简单方案</p> <p>6.1.2 缓存方案</p> <p>6.1.3 克隆方案</p> <p>6.2 异步加载CSB</p> <p>6.3 **播放CSB动画</p> <p>第7章 调试Cocos2d-x</p> <p>7.1 控制台调试</p> <p>7.2 使用KxDebuger调试Cocos2d-x</p> <p>第8章 调试技巧总结</p> <p>8.1 初级调试技巧</p> <p>8.1.1 基础操作</p> <p>8.1.2 启动调试</p> <p>8.1.3 条件断点</p> <p>8.1.4 监视技巧</p> <p>8.2 **调试技巧</p> <p>8.2.1 远程调试</p> <p>8.2.2 coredump调试</p> <p>8.2.3 使用Bugly捕获崩溃堆栈</p> <p>8.2.4 命中断点</p> <p>8.2.5 数据断点</p> <p>8.2.6 即时窗口</p> <p>8.2.7 多线程调试</p> <p>8.2.8 性能调试</p> <p>8.3 记一次内存泄漏调试</p> <p>8.3.1 内存泄漏表象</p> <p>8.3.2 初步分析</p> <p>8.3.3 排查问题</p> <p>8.3.4 修改代码定位泄漏点</p> <p>8.3.5 开始调试</p> <p>第9章 物理引擎——Box2d基础</p> <p>9.1 核心概念</p> <p>9.2 工作流程</p> <p>9.3 物理世界World</p> <p>9.4 Body和Shape</p> <p>9.4.1 刚体的碰撞</p> <p>9.4.2 创建刚体</p> <p>9.5 关节Joint</p> <p>9.5.1 使用关节</p> <p>9.5.2 旋转关节RevoluteJoint</p> <p>9.5.3 平移关节PrismaticJoint</p> <p>9.5.4 距离关节DistanceJoint</p> <p>9.5.5 滑轮关节PulleyJoint</p> <p>9.5.6 鼠标关节MouseJoint</p> <p>9.5.7 齿轮关节GearJoint</p> <p>9.5.8 滚轮关节WheelJoint</p> <p>9.5.9 焊接关节WeldJoint</p> <p>9.5.10 摩擦关节FrictionJoint</p> <p>9.5.11 绳索关节RopeJoint</p> <p>第10章 物理引擎——应用到Cocos2d-x</p> <p>10.1 物体的运动</p> <p>10.1.1 施加力和冲量</p> <p>10.1.2 角力矩和角冲量</p> <p>10.2 碰撞检测</p> <p>10.2.1 碰撞监听</p> <p>10.2.2 碰撞过滤</p> <p>10.3 Box2d的调试渲染</p> <p>10.4 在Cocos2d-x中使用Box2d</p> <p>10.4.1 物理世界</p> <p>10.4.2 物理Sprite</p> <p>10.4.3 碰撞处理</p> <p>10.5 Box2d的相关工具</p> <p>10.5.1 PhysicsEditor介绍</p> <p>10.5.2 BoxCAD介绍</p> <p>10.5.3 Physics Body Editor介绍</p> <p>10.5.4 Vertex Helper介绍</p> <p>第11章 图元渲染</p> <p>11.1 使用DrawingPrimitives接口绘制图元</p> <p>11.1.1 如何绘制图元</p> <p>11.1.2 半透明效果</p> <p>11.1.3 抗锯齿</p> <p>11.2 使用DrawNode绘制图元</p> <p>11.3 渲染接口详解</p> <p>11.3.1 绘制点</p> <p>11.3.2 绘制线段、矩形、多边形与圆形</p> <p>11.3.3 绘制贝塞尔曲线</p> <p>11.3.4 绘制CardinalSpline</p> <p>11.3.5 绘制凯特摩曲线</p> <p>11.3.6 绘制实心图元</p> <p>11.4 小结</p> <p>第12章 Spine骨骼动画</p> <p>12.1 Spine功能简介</p> <p>12.2 Spine结构</p> <p>12.3 使用Spine</p> <p>12.3.1 加载Spine</p> <p>12.3.2 播放动画</p> <p>12.3.3 动画回调</p> <p>12.3.4 显示控制</p> <p>12.4 Spine**技巧</p> <p>12.4.1 混合动画</p> <p>12.4.2 缓存Spine骨骼动画</p> <p>12.4.3 异步加载Spine骨骼</p> <p>12.4.4 Spine的性能优化</p> <p>第13章 2D、3D粒子**</p> <p>13.1 2D粒子**</p> <p>13.1.1 粒子系统简介</p> <p>13.1.2 手动创建粒子系统</p> <p>13.1.3 使用Cocos2d-x内置的粒子系统</p> <p>13.1.4 使用Plist文件加载粒子系统</p> <p>13.1.5 操作粒子系统</p> <p>13.2 2D粒子系统运行流程</p> <p>13.2.1 流程简介</p> <p>13.2.2 粒子的更新和渲染</p> <p>13.3 3D粒子**</p> <p>13.3.1 组件系统</p> <p>13.3.2 Particle Universe支持的组件</p> <p>13.4 使用Particle Universe粒子系统</p> <p>13.4.1 使用PUParticleSystem3D</p> <p>13.4.2 PUParticleSystem3D相关接口</p> <p>13.5 3D粒子系统源码简析</p> <p>13.5.1 ParticleSystem3D结构</p> <p>13.5.2 初始化流程</p> <p>第14章 裁剪与遮罩</p> <p>14.1 片段测试</p> <p>14.1.1 裁剪测试</p> <p>14.1.2 Alpha测试</p> <p>14.1.3 模板测试</p> <p>14.1.4 深度测试</p> <p>14.2 裁剪</p> <p>14.2.1 使用ClippingRectangleNode</p> <p>14.2.2 ClippingRectangleNode的实现</p> <p>14.3 遮罩</p> <p>14.3.1 ScrollViewDemo示例</p> <p>14.3.2 HoleDemo示例</p> <p>14.3.3 详解HoleDemo示例</p> <p>14.3.4 ClippingNode的实现</p> <p>第15章 使用Shader——GLSL基础</p> <p>15.1 Shader简介</p> <p>15.2 图形渲染管线</p> <p>15.2.1 顶点处理器</p> <p>15.2.2 片段处理器</p> <p>15.2.3 插值计算</p> <p>15.3 GLSL基础语法</p> <p>15.3.1 数据类型和变量</p> <p>15.3.2 操作符</p> <p>15.3.3 变量修饰符、统一变量和属性变量</p> <p>15.3.4 易变变量</p> <p>15.3.5 语句与函数</p> <p>15.3.6 Shader简单示例</p> <p>15.4 在OpenGL中使用Shader</p> <p>15.4.1 在OpenGL中创建Shader</p> <p>15.4.2 属性变量</p> <p>15.4.3 统一变量</p> <p>15.4.4 错误处理</p> <p>15.4.5 清理工作</p> <p>15.5 在Cocos2d-x中使用Shader</p> <p>15.5.1 Cocos2d-x的Shader架构</p> <p>15.5.2 Cocos2d-x内置Shader规则</p> <p>15.5.3 编写Shader</p> <p>15.5.4 使用Shader的步骤</p> <p>第16章 使用Shader——常用**</p> <p>16.1 Blur模糊效果</p> <p>16.2 OutLine描边效果</p> <p>16.3 RGB、HSV与HSL效果</p> <p>16.4 调整色相</p> <p>16.5 流光效果</p> <p>第2篇 Lua篇</p> <p>第17章 Lua基础概述</p> <p>17.1 类型与值</p> <p>17.2 操作符</p> <p>17.2.1 算术操作符</p> <p>17.2.2 关系操作符</p> <p>17.2.3 逻辑操作符</p> <p>17.2.4 其他操作符</p> <p>17.3 语句</p> <p>17.3.1 赋值语句</p> <p>17.3.2 语句块</p> <p>17.3.3 条件语句</p> <p>17.3.4 循环语句</p> <p>17.4 函数</p> <p>17.4.1 定义函数</p> <p>17.4.2 调用函数</p> <p>17.4.3 函数参数</p> <p>17.4.4 尾调用</p> <p>17.5 闭包与泛型for</p> <p>17.5.1 闭包</p> <p>17.5.2 泛型for</p> <p>第18章 Lua——table</p> <p>18.1 使用table</p> <p>18.1.1 创建table</p> <p>18.1.2 访问table</p> <p>18.1.3 修改table</p> <p>18.1.4 删除table</p> <p>18.1.5 遍历table</p> <p>18.2 元表metatable</p> <p>18.2.1 元方法</p> <p>18.2.2 算术、关系与连接元方法</p> <p>18.2.3 特殊的元方法</p> <p>18.2.4 __index元方法</p> <p>18.2.5 __newindex元方法</p> <p>18.2.6 __mode元方法</p> <p>18.3 packages介绍</p> <p>18.3.1 require()方法</p> <p>18.3.2 编写模块</p> <p>18.4 面向对象</p> <p>18.4.1 定义类</p> <p>18.4.2 实例化</p> <p>18.4.3 继承</p> <p>18.5 table库</p> <p>18.5.1 插入</p> <p>18.5.2 排序</p> <p>18.5.3 pack()和unpack()方法</p> <p>18.5.4 table长度</p> <p>第19章 Lua与C的通信</p> <p>19.1 准备工作</p> <p>19.1.1 头文件与链接库</p> <p>19.1.2 lua_State指针</p> <p>19.1.3 堆栈</p> <p>19.1.4 压入堆栈</p> <p>19.1.5 访问堆栈</p> <p>19.1.6 堆栈的其他操作</p> <p>19.2 操作table</p> <p>19.2.1 如何将table传入Lua</p> <p>19.2.2 如何获取Lua返回的table</p> <p>19.3 C/C 中调用Lua</p> <p>19.3.1 执行Lua片段</p> <p>19.3.2 执行Lua脚本文件</p> <p>19.3.3 调用Lua函数</p> <p>19.4 注册C/C 函数给Lua调用</p> <p>19.5 将C 的类传给Lua</p> <p>第20章 Cocos2d-x原生Lua框架详解</p> <p>20.1 Cocos2d-x原生Lua框架结构</p> <p>20.1.1 Lua核心层</p> <p>20.1.2 Lua脚本引擎</p> <p>20.1.3 Cocos2d-x到Lua的转换层</p> <p>20.1.4 Lua辅助层</p> <p>20.2 使用Cocos2d-x原生Lua框架</p> <p>20.2.1 在Cocos2d-x中调用Lua</p> <p>20.2.2 在Lua中操作Cocos2d-x</p> <p>20.3 Cocos2d-x原生Lua框架运行流程</p> <p>20.3.1 LuaEngine初始化流程</p> <p>20.3.2 加载Lua脚本</p> <p>20.3.3 Cocos2d-x到Lua的事件分发</p> <p>20.3.4 Lua辅助层初始化流程</p> <p>20.3.5 Lua辅助层的实用工具</p> <p>20.4 使用genbindings.py导出自定义类</p> <p>20.4.1 各个平台的环境搭建</p> <p>20.4.2 编写要导出的C 的类</p> <p>20.4.3 编写ini配置文件</p> <p>20.4.4 修改并执行genbindings.py</p> <p>20.4.5 注册并在Lua中使用</p> <p>20.5 扩展Cocos2d-x Lua</p> <p>20.5.1 编写扩展方法</p> <p>20.5.2 注册到类中</p> <p>20.6 lua-tests导读</p> <p>第21章 Cocos2d-x Quick框架详解</p> <p>21.1 Quick简介</p> <p>21.2 Quick框架结构</p> <p>21.3 使用Quick</p> <p>21.3.1 创建Quick项目</p> <p>21.3.2 **个Quick程序</p> <p>21.3.3 开发工具</p> <p>21.4 Quick运行流程分析</p> <p>21.4.1 初始化流程</p> <p>21.4.2 MVC框架运行流程</p> <p>21.5 Quick脚本框架详解</p> <p>21.5.1 Quick脚本框架整体结构</p> <p>21.5.2 Quick框架基础模块</p> <p>21.5.3 Quick脚本框架初始化流程</p> <p>第22章 Quick框架实践——MVC框架</p> <p>22.1 组件系统详解</p> <p>22.1.1 EventProtocol事件组件</p> <p>22.1.2 StateMachine状态机组件</p> <p>22.2 ModelBase详解</p> <p>22.3 MVC示例详解</p> <p>22.3.1 代码结构简介</p> <p>22.3.2 启动流程详解</p> <p>22.3.3 发射子弹</p> <p>22.3.4 命中目标</p> <p>22.4 小结</p> <p>第3篇 网络篇</p> <p>第23章 网络游戏——网游开发概述</p> <p>23.1 弱联网游戏</p> <p>23.2 强联网游戏</p> <p>23.3 局域网游戏</p> <p>第24章 弱联网游戏——Cocos2d-x客户端实现</p> <p>24.1 客户端请求流程</p> <p>24.2 Libcurl easy接口详解</p> <p>24.2.1 关于请求链接</p> <p>24.2.2 关于Post提交表单</p> <p>24.2.3 关于读写</p> <p>24.3 使用多线程执行请求</p> <p>第25章 弱联网游戏——PHP服务器实现... 362</p> <p>25.1 环境搭建... 362</p> <p>25.1.1 安装PHP. 362</p> <p>25.1.2 安装Nginx. 363</p> <p>25.1.3 安装MySQL. 363</p> <p>25.1.4 启动服务... 364</p> <p>25.2 编写PHP. 365</p> <p>25.2.1 基本语法... 365</p> <p>25.2.2 表单处理... 366</p> <p>25.2.3 操作MySQL. 366</p> <p>25.3 实现签到服务... 366</p> <p>第26章 强联网游戏——TCP和Socket 369</p> <p>26.1 Socket接口与TCP. 369</p> <p>26.1.1 TCP服务器与客户端交互流程... 370</p> <p>26.1.2 Socket API 详解... 372</p> <p>26.1.3 Windows Socket API详解... 376</p> <p>26.2 简单的TCP服务器端与客户端... 376</p> <p>26.2.1 TCP服务器实现... 377</p> <p>26.2.2 TCP客户端实现... 379</p> <p>26.3 非阻塞Socket与select()函数... 380</p> <p>26.3.1 非阻塞Socket 380</p> <p>26.3.2 select()函数的使用... 380</p> <p>26.3.3 调整TCP服务器为Select模型... 382</p> <p>26.4 半包粘包... 384</p> <p>26.4.1 什么是半包粘包... 384</p> <p>26.4.2 处理半包粘包... 385</p> <p>26.5 心跳与超时... 387</p> <p>26.5.1 TCP的死连接... 388</p> <p>26.5.2 检测死连接... 389</p> <p>第27章 强联网游戏——单机版动作游戏... 390</p> <p>27.1 需求分析与类设计... 390</p> <p>27.2 创建工程和场景... 393</p> <p>27.3 添加实体... 396</p> <p>27.4 实体显示组件... 399</p> <p>27.5 消息定义... 400</p> <p>27.6 添加SingleProxy. 401</p> <p>27.7 游戏的主逻辑... 402</p> <p>第28章 强联网游戏——C 服务器实现... 404</p> <p>28.1 服务端需求分析... 404</p> <p>28.2 kxServer的使用... 404</p> <p>28.3 NetDemoServer服务器... 405</p> <p>28.4 接收客户端请求... 409</p> <p>28.5 移植前端代码... 412</p> <p>28.6 梳理流程和总结... 412</p> <p>第29章 网络游戏——前后端网络同步... 414</p> <p>29.1 整理入口场景... 414</p> <p>29.2 连接服务器... 416</p> <p>29.3 添加OnlineProxy. 416</p> <p>29.4 打包与恢复场景... 418</p> <p>29.5 实时同步... 419</p> <p>第30章 局域网游戏——使用UDP. 423</p> <p>30.1 使用UDP. 423</p> <p>30.2 UDP通信流程... 424</p> <p>30.2.1 sendto()函数... 424</p> <p>30.2.2 recvfrom()函数... 425</p> <p>30.3 UDP广播... 425</p> <p>30.3.1 什么是网络号和主机号... 426</p> <p>30.<st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="True" sourcevalue="3.2" unitname="a">3.2 A</st1:chmetcnv>类、B类、C类地址与广播地址... 426</p> <p>30.3.3 什么是子网和子网掩码... 426</p> <p>30.3.4 本地网络的定义是什么... 427</p> <p>30.3.5 发送广播... 427</p> <p>30.4 简单的UDP服务器... 428</p> <p>30.5 简单的UDP客户端... 429</p> <p>第31章 局域网游戏——建立、搜索、加入房间... 430</p> <p>31.1 建立房间... 430</p> <p>31.2 移植后端代码... 432</p> <p>31.3 搜索房间... 434</p> <p>第4篇 跨平台篇</p> <p>第32章 Android环境搭建... 440</p> <p>32.1 Android环境搭建基础... 440</p> <p>32.1.1 JDK和JRE. 440</p> <p>32.1.2 关于ADK. 442</p> <p>32.1.3 关于NDK. 443</p> <p>32.2 使用Eclipse打包... 443</p> <p>32.2.1 打开Android项目... 443</p> <p>32.2.2 解决Java报错... 444</p> <p>32.2.3 设置NDK. 448</p> <p>32.2.4 解决打包报错... 450</p> <p>32.2.5 解决运行报错... 451</p> <p>32.3 使用Android Studio打包... 453</p> <p>32.3.1 cocos compile命令... 453</p> <p>32.3.2 编译打包Android Studio. 454</p> <p>32.3.3 打包遇到的问题... 455</p> <p>32.4 新建Android项目... 456</p> <p>32.5 实用技巧... 458</p> <p>32.5.1 关于版本问题... 458</p> <p>32.5.2 关于减少包体积... 459</p> <p>第33章 使用JNI实现C 与Java互调... 461</p> <p>33.1 Android基本概念... 461</p> <p>33.1.1 Activity简介... 461</p> <p>33.1.2 Intent简介... 463</p> <p>33.1.3 资源与R.java. 463</p> <p>33.1.4 AndroidManifest.xml简介... 463</p> <p>33.2 Hello JNI项目... 463</p> <p>33.2.1 使用Eclipse创建项目... 463</p> <p>33.2.2 使用Android Studio创建项目... 465</p> <p>33.3 编写JNI的C 代码... 467</p> <p>33.3.1 为Eclipse添加Android.mk和hello.c. 467</p> <p>33.3.2 在Android Studio下编写JNI 468</p> <p>33.<st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="True" sourcevalue="3.3" unitname="C">3.3 C</st1:chmetcnv> 的函数原型... 471</p> <p>33.<st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="True" sourcevalue="3.4" unitname="C">3.4 C</st1:chmetcnv> 调用Java. 472</p> <p>33.4 Java调用C . 473</p> <p>33.5 在C 程序中使用Java. 474</p> <p>33.6 在Cocos2d-x中实现Java和C 的互调... 479</p> <p>33.6.1 Cocos2d-x的JNI初始化... 480</p> <p>33.6.2 在Cocos2d-x中调用Java. 480</p> <p>33.6.3 在Java中调用Cocos2d-x. 481</p> <p>33.7 Android.mk和Application.mk详解... 481</p> <p>33.7.1 认识Android.mk. 481</p> <p>33.7.2 用Android.mk添加源文件以及指定头文件目录... 482</p> <p>33.7.3 在Android.mk中引用其他模块(第三方库)... 482</p> <p>33.7.4 Android.mk的一些变量和函数... 484</p> <p>33.7.5 关于Application.mk. 484</p> <p>33.8 ABI详解... 485</p> <p>33.8.1 常见的ABI 485</p> <p>33.8.2 如何选择ABI 485</p> <p>33.8.3 如何生成对应ABI的so. 486</p> <p>33.9 调试JNI代码... 486</p> <p>33.9.1 Android Studio JNI 调试环境搭建... 487</p> <p>33.9.2 Android Studio 的断点调试... 490</p> <p>第34章 iOS环境搭建与真机调试... 492</p> <p>34.1 iOS环境搭建... 492</p> <p>34.1.1 环境搭建... 492</p> <p>34.1.2 Windows移植iOS. 493</p> <p>34.2 iOS证书... 494</p> <p>34.2.1 Mac的证书... 495</p> <p>34.2.2 注册***... 495</p> <p>34.2.3 如何获得证书... 495</p> <p>34.2.4 创建证书... 496</p> <p>34.2.5 关于证书密钥... 498</p> <p>34.3 iOS真机调试... 500</p> <p>34.3.1 无证书调试... 500</p> <p>34.3.2 使用证书调试... 502</p> <p>34.4 打包IPA. 505</p> <p>34.4.1 正确设置签名证书与授权文件... 505</p> <p>34.4.2 使用Xcode打包... 506</p> <p>34.4.3 其他打包方式... 509</p> <p>第35章 Objective-C与C 互调... 511</p> <p>35.1 Objective-C基础语法... 511</p> <p>35.1.1 Objective-C的一些特性... 511</p> <p>35.1.2 Objective-C的类... 512</p> <p>35.2 Objective-C与C 混编... 514</p> <p>第36章 接入AnySDK. 515</p> <p>36.1 AnySDK概述... 515</p> <p>36.1.1 为什么要接入AnySDK. 515</p> <p>36.1.2 AnySDK架构简介... 516</p> <p>36.1.3 AnySDK快速接入指引... 517</p> <p>36.2 接入AnySDK Android框架... 520</p> <p>36.2.1 导入Android AnySDK Framework. 521</p> <p>36.2.2 初始化AnySDK Framework. 522</p> <p>36.3 接入AnySDK iOS 框架... 526</p> <p>36.3.1 导入AnySDK Framework. 527</p> <p>36.3.2 初始化AnySDK Framework. 530</p> <p>36.4 登录流程... 531</p> <p>36.4.1 登录流程简介... 531</p> <p>36.4.2 客户端接入登录... 532</p> <p>36.4.3 服务端接入登录... 534</p> <p>36.5 支付流程... 536</p> <p>36.5.1 支付流程... 536</p> <p>36.5.2 客户端接入支付... 537</p> <p>36.5.3 服务端接入支付... 539</p> <p>36.6 母包联调... 540</p> <p>36.6.1 调试登录... 540</p> <p>36.6.2 调试支付... 541</p> <p>36.7 打包工具... 542</p> <p>36.8 小结... 543</p>显示全部信息前 言笔者**次接触Cocos2d-x是在2012年初。当时与一位朋友尝试着制作了一款小游戏,上了App Store平台。在开发中,笔者主要负责游戏美术,这其实不是笔者的长项,所以该游戏的美术效果可以用惨不忍睹来形容。虽然那时候的引擎版本只是1.x,并且开发的游戏相当失败,但通过这个游戏,笔者对Cocos2d-x产生了浓厚的兴趣。
其实Cocos2d-x算不上是一款功能**的游戏引擎,但它很简洁、小巧,是一款轻量级的游戏引擎。大多数程序员实际上更喜欢简洁的东西,而不是庞然大物。Cocos2d-x简洁的设计结合丰富的Demo,让人可以很快上手,并能使用它开发出一些简单的游戏。其代码的开源及跨平台特性也相当诱人。Cocos2d-x本身的这些特性结合市场的需求,使其很快就成为手游开发的主流引擎之一。
在Cocos2d-x刚开始“火”的那一段时间,市面上关于Cocos2d-x的书籍还十分匮乏。笔者利用业余时间对该引擎进行了深入研究,并使用它开发了几个小游戏,也总结了一些开发经验。之后一段时间,笔者萌生了按照自己的想法写一本Cocos2d-x游戏开发图书的想法。这个想法很快便进入了实施阶段,但进展远没有想象的顺利。其原因一方面是笔者写作的速度跟不上Cocos2d-x的更新速度,另一方面是笔者的工作任务也很重,加之写作期间还开发了四五个游戏作品,这使得本来就不充裕的时间更是捉襟见肘。<span> 笔者**次接触Cocos2d-x是在2012年初。当时与一位朋友尝试着制作了一款小游戏,上了App Store平台。在开发中,笔者主要负责游戏美术,这其实不是笔者的长项,所以该游戏的美术效果可以用惨不忍睹来形容。虽然那时候的引擎版本只是1.x,并且开发的游戏相当失败,但通过这个游戏,笔者对Cocos2d-x产生了浓厚的兴趣。</span><br /><span> 其实Cocos2d-x算不上是一款功能**的游戏引擎,但它很简洁、小巧,是一款轻量级的游戏引擎。大多数程序员实际上更喜欢简洁的东西,而不是庞然大物。Cocos2d-x简洁的设计结合丰富的Demo,让人可以很快上手,并能使用它开发出一些简单的游戏。其代码的开源及跨平台特性也相当诱人。Cocos2d-x本身的这些特性结合市场的需求,使其很快就成为手游开发的主流引擎之一。</span><br /><span> 在Cocos2d-x刚开始“火”的那一段时间,市面上关于Cocos2d-x的书籍还十分匮乏。笔者利用业余时间对该引擎进行了深入研究,并使用它开发了几个小游戏,也总结了一些开发经验。之后一段时间,笔者萌生了按照自己的想法写一本Cocos2d-x游戏开发图书的想法。这个想法很快便进入了实施阶段,但进展远没有想象的顺利。其原因一方面是笔者写作的速度跟不上Cocos2d-x的更新速度,另一方面是笔者的工作任务也很重,加之写作期间还开发了四五个游戏作品,这使得本来就不充裕的时间更是捉襟见肘。</span><br /><span> 的确,Cocos2d-x的更新非常频繁,并且引擎更新的同时带来了很多接口的变化,一些代码甚至需要进行重构。除了原有内容的变化改动之外,日益增加的新功能也加大了写作的难度。虽然2013年底笔者已经完成了初稿,但是回过头来阅读一遍,发现书稿难以达到自己的预期。于是笔者做了一个决定:推翻重写。在经历了几个月的重写之后,Cocos2d-x版本已经升级到了3.0。笔者发现又有许多新增功能和新特性需要重新了解和学习,于是又经历了一段时间的学习和使用,不得不决定再次对书稿做较大的改动,几乎又推翻重写了一次。从开始写作直至完成书稿,整个过程一言难尽,饱含艰辛。在写作的过程中,Cocos2d-x的书籍如雨后春笋相继面市,加上自己工作繁忙,写作时间有限,一度产生了放弃的念头。但写一本自己满意的Cocos2d-x图书的信念支撑笔者走到了*后。当然,这一切对笔者而言很有意义,也很有价值:其一是有机会能和读者共享自己的心得体会;其二是笔者自己也得到了提升。毕竟写书相对于写代码而言需要考虑的东西更多。代码写错还可以改正,而书写错则将误人子弟。</span><br /><span> 考虑到读者群体的不同,笔者将本书分为《基础卷》和《进阶卷》两个分册。《基础卷》主要是为了让读者夯实Cocos2d-x游戏开发的基础知识,适合没有经验的零基础读者阅读。《进阶卷》内容全面,且实用性很强,可以拿来就用,快速解决问题,适合想要进阶学习的读者阅读,也可以作为一本解决实际问题的手册使用。当然,对于想要全面而深入学习Cocos2d-x游戏开发的读者而言,则需要系统阅读这两本书。</span><br /><span> 本书是《精通Cocos2d-x游戏开发》的《进阶卷》,是一种实用的Cocos2d-x进阶图书,是在笔者完成《基础卷》写作之后,用了一年多的时间编写的。这一年多笔者工作繁忙,压力巨大,几乎很难在晚上10点之前下班,通常晚上一两点下班是家常便饭。*长的加班记录是到了第二天早上9点,也就是正常上班的时间。笔者在这种情况下利用大量业余时间写作完成书稿,实属不易。在写作过程中,笔者不断地将之前已完成的书稿中的一些过时内容及难以令自己满意的内容推翻重写,力求**。</span><br /><span> 虽然工作繁忙,但笔者在工作中积累的经验也成为了《进阶卷》的宝贵素材。本书介绍了丰富的实用技巧,针对开发过程中需要用到的各种技术及可能碰到的各种问题,做了全面而深入的介绍。无论是需要解决问题的读者还是需要增长经验的读者,都能通过阅读本书有所收获。本书对读者的要求略高,需要读者熟悉Cocos2d-x,*好能有一定的开发经验。虽然在编写时笔者尽量做到了图文并茂,让内容更加通俗易懂,但对于初学者而言还是有一定的难度。所以建议初学Cocos2d-x的读者先阅读《基础卷》,以巩固好基础,然后再来阅读《进阶卷》,这样学习效果会更好。如果是有针对性地解决某一问题,读者可以阅读相应章节。欢迎读者在本书的QQ群中对阅读中的疑问进行交流和讨论。相信本书能够让每一个基础扎实的Cocos2d-x程序员成为一个经验丰富的Cocos2d-x开发高手。</span><br /><span> 本书内容特色</span><br /><span> 1.内容新颖,紧跟趋势</span><br /><span> 本书内容新颖,紧跟技术趋势,以当前主流的Cocos2d-x游戏引擎版本3.x为主进行讲解,在一些必要的地方也兼顾了早期的2.x版本的内容,并对新旧版本之间的差异做了必要说明,适合更多的读者群体阅读。</span><br /><span> 2.覆盖面广,实用性强</span><br /><span> 本书专注于解决开发过程中碰到的各种问题,介绍各种常用的开发技术,涵盖了游戏客户端开发的大部分问题。</span><br /><span> 3.追求原创,与时俱进</span><br /><span> 相较于市场上千篇一律的Cocos2d-x学习教程,本书力求做到与众不同,与时俱进。书中内容的组织不是堆砌知识点和简单地翻译技术文档,而是从学习和理解的角度出发,并结合了笔者的实际开发经验,使用绝大多数章节都是“干货满满”。</span><br /><span> 4.风格活泼,讲述准确</span><br /><span> 刻板的风格不是笔者所钟爱的行文风格。笔者更喜欢用较为简单和自由的文字和读 者交流,所以本书阅读起来并不会枯燥乏味。另外,讲解的准确性是对科技图书的基本 要求,只有准确的表达才能让读者不至于出现太多的理解偏差。所以笔者对书中的表述经过了反复斟酌和提炼,并采用了大量例图、举例和类比等手法,以便于读者更容易理解和掌握。</span><br /><span> 5.举一反三,扩展思维</span><br /><span> 本书并不满足于按部就班地介绍功能和API,而是从实际应用出发,扩散思维,在解决问题的同时,让读者思考问题的本质,以更深入地理解所学知识,从而达到举一反三、学以致用的效果。虽然本书介绍的是Cocos2d-x,但对技术点的介绍并不局限于Cocos2d-x,对于使用其他引擎的***,很多知识都是相通的,即所谓知行合一,方能真正掌握 知识。</span><br /><span> 本书内容及知识体系</span><br /><span> 第1篇 实用技术篇(第1~16章)</span><br /><span> 本篇深入介绍了Cocos2d-x游戏开发的各种实用技术,涵盖了热更新、加密解密、骨骼动画、调试技巧、Shader**、物理引擎、分辨率适配等实用的技术点。读者可以根据自己的需求和兴趣挑选本篇的章节进行阅读。</span><br /><span> 第2篇 Lua篇(第17~22章)</span><br /><span> 本篇介绍了在Cocos2d-x中使用Lua开发的技巧,包含了Lua的基础知识,以及在Cocos2d-x中如何使用Lua,分析了Quick-Cocos2d-x框架和原生Lua框架的区别。</span><br /><span> 第3篇 网络篇(第23~31章)</span><br /><span> 本篇介绍了如何使用Cocos2d-x开发网络游戏,包含了网络基础知识的讲解,以及弱联网、强联网、局域网这3种网络游戏的前后端开发,并提供了一个简易横版实时对战游戏的Demo,相信读者可以在Demo中更好地了解网络游戏的开发知识。</span><br /><span> 第4篇 跨平台篇(第32~36章)</span><br /><span> 跨平台开发是Cocos2d-x程序员所必须掌握的知识,初次进行跨平台移植的读者难免会遇到不少问题,本篇详细介绍了iOS和Android平台下的开发和打包,涵盖了丰富的知识点,如证书签名、ABI、JNI等技术。打包也不是简单地罗列操作步骤,对打包过程中遇到的各种问题都会追本溯源。另外本篇还介绍了如何使用AnySDK在iOS和Android下快速接入第三方SDK。</span><br /><span> 本书阅读建议</span><br /><span> 由于Cocos2d-x游戏引擎是基于C 的,所以一些基础的C 知识是必须知道的。假如读者完全没有任何编程方面的经验,则不��合阅读本书。</span><br /><span> 书中部分章节的内容可能较为深入,如果读者对这部分内容一时难以理解,可以先跳过而阅读后续章节,等读完后续章节再回头阅读这部分内容,也许就豁然开朗了。如果是为了解决某个问题或者系统学习某个技术点,这种有针对性的阅读效率会更高。</span><br /><span> 本书中的部分例子引用自Cocos2d-x引擎自带的TestCpp,本书的配套资源中也提供了本书的代码下载方式,读者在学习的过程中可以参照TestCpp中的例子。</span><br /><span> 本书读者对象</span><br /><span> * 有一定Cocos2d-x游戏开发经验的人员;</span><br /><span> * Cocos2d-x开发人员;</span><br /><span> * 想系统学习Cocos2d-x的程序员;</span><br /><span> * 想丰富Cocos2d-x开发经验的程序员;</span><br /><span> * 想开发跨平台手机游戏的人员;</span><br /><span> * 从其他开发转向Cocos2d-x的程序员;</span><br /><span> * 大中专院校的学生和社会培训的学员。</span><br /><span> 本书配套资源获取方式</span><br /><span> 本书涉及的源代码等资源需要读者自行下载。请读者登录清华大学出版社网站,然后搜索到本书页面,在页面上找到“资源下载”栏目,然后单击“课件下载”或者“网络资源”按钮即可。读者也可以在笔者的github中获取。</span><br /><span> 本书的编写对笔者而言是一个不小的挑战,虽然笔者投入了大量的精力和时间,但只怕百密难免一疏。若读者在阅读本书时发现任何疏漏,希望能及时反馈给我们,以便及时更正。联系我们请发邮件至bookservice2008@163.com。</span><br /><span> *后祝各位读者读书快乐,学习进步!</span><br /><span> 编者著</span><br />显示全部信息媒体评论本书作者拥有丰富的一线研发经验,对Cocos引擎也有着深入而独到的理解。整个写作期间,他对这本书倾注了大量的心血,精心打磨,多次对不满意的地方推翻重写。这份执着和热忱加精益求精的态度令人感动。这本书内容新颖,紧跟技术趋势,注重实际应用,讲述准确而深入,对游戏开发人员而言是一本****的专业好书,认真阅读一定大有裨益。 ——Cocos2d-x创始人 王哲免费在线读第5章 分辨率适配
当在不同的分辨率下运行程序时,就会碰到分辨率适配的问题,如出现黑边、界面的一部分显示在屏幕外,我们希望程序在不同的分辨率下运行都能有良好的表现。在Cocos2d-x中,可以通过选择合适的分辨率适配策略,结合合适的坐标编码,适配各种不同的分辨率。而灵活使用Cocos2d-x的分辨率适配策略,还可以解决各种分辨率适配的难题。本章主要介绍以下内容:
* Cocos2d-x适配策略。
* 分辨率适配经验。
* CocoStudio分辨率适配。
5.1 Cocos2d-x适配策略
可以在Cocos2d-x中调用CCEGLView的setDesignResolutionSize方法设置游戏的分辨率策略,以及我们的设计分辨率。
setDesignResolutionSize()方法包含3个参数,分别是设计分辨率的宽和高,以及分辨率的适配策略。下面这行代码设置了960 times;640的设计分辨率,并使用了SHOW_ALL分辨率适配策略。
Director::getInstance()- getOpenGLView()- setDesignResolutionSize(960, 640, ResolutionPolicy::SHOW_ALL);
5.1.1 分辨率适配策略
Cocos2d-x的分辨率适配一般不是为每一种分辨率设计一种布局方案,而是在一种分辨率下进行设计(也就是设计分辨率),然后通过分辨率适配策略,让程序能够适应不同的分辨率。Cocos2d-x提供以下5种分辨率适配策略。
* EXACT_FIT以设置的分辨率为标准,按照该分辨率对x和y进行拉伸。
* NO_BORDER不留黑边,不拉伸,等比缩放,有一个方向(上下或左右)可能超出屏幕。
* SHOW_ALL设置的分辨率区域内全部可见,但上下左右都可能出现黑边。
* FIXED_HEIGHT锁定分辨率的高度,宽度不管,可能出现黑边也可能超出屏幕。