作品简介

《我所理解的Cocos2d-x》针对最新的 Cocos2d-x 3.x版本,介绍了Coco2d-x游戏引擎的基本架构、渲染机制,以及各个子模块的功能和原理,并结合OpenGL ES图形渲染管线,深入探讨了游戏开发中涉及的相关图形学的知识,内容包括:Cocos2d-x的基本架构及渲染机制、纹理相关的知识、OpenGL ES 2.0渲染管线、计算机字体的绘制、多分辨率支持、事件分发、碰撞与物理引擎、游戏对象模型架构、Genius-x开源框架、脚本在游戏引擎中的架构等。《我所理解的Cocos2d-x》偏重讲解每个知识模块的概念及原理,使读者能够透过现象看到其背后的工作机制,所以本书在内容组织上并不是围绕Cocos2d-x的接口使用来展开,而是按照通用游戏引擎架构及图形学的内容进行组织。

《我所理解的Cocos2d-x》面向中、高级开发者,可作为初级开发者进阶的教程,也可作为高校游戏引擎架构及图形学相关专业的参考教材。

秦春林,自大学开始自学编程,先后从事过工作流软件,云计算,Web等相关的工作。2011年开始进入游戏开发领域,主持并移植了Cocos2d-x-for-XNA项目。喜欢技术分享,发起并组织了北京快乐技术沙龙,多次作为讲师参与微软,CSDN,51CTO以及9RIA等组织的各类技术培训和讲座。参与了手游项目《天降》的开发,目前主要的兴趣方向是计算机图形学和游戏引擎架构,致力于用软件技术丰富游戏世界的表现及品质。

作品目录

  • 前言
  • 致谢
  • 推荐序
  • 第1章 全新的Cocos2d-x 3.0
  • 1.1 Cocos2d-x 3.0的历史意义
  • 1.1.1 回归C++风格
  • 1.1.2 更灵活的渲染架构
  • 1.1.3 更自由的发展
  • 1.2 Cocos2d-x 3.0的新特性
  • 1.2.1 使用C++风格
  • 1.2.2 跨平台的Label
  • 1.2.3 新的渲染系统
  • 1.2.4 统一的消息分发
  • 1.2.5 物理引擎集成
  • 1.2.6 新的数据结构
  • 1.Map<K,V>的性能
  • 2.与Cocos2d-x内存管理的结合
  • 3.移动语义
  • 1.2.7 其他
  • 1.3 Cocos2d-x引擎展望
  • 1.3.1 3D
  • 1.3.2 Cocos Code IDE
  • 1.4 本章小结
  • 第2章 Cocos2d-x架构一瞥
  • 2.1 Cocos2d-x引擎系统总览
  • 2.2 Cocos2d-x内存管理机制
  • 2.2.1 C++显式堆内存管理
  • 2.2.2 C++11中的智能指针
  • 2.2.3 为什么不使用智能指针
  • 2.2.4 垃圾回收机制
  • 2.2.5 Cocos2d-x内存管理机制
  • 1.引用计数
  • 2.用autorelease()方法声明一个“智能指针”
  • 3.AutoreleasePool队列
  • 2.2.6 Cocos2d-x中的智能指针
  • 1.构造函数
  • 2.赋值操作符
  • 3.弱引用赋值
  • 4.其他操作
  • 5.RefPtr<T>与容器
  • 6.RefPtr<T>与自动回收池的比较
  • 7.RefPtr<T>的缺陷
  • 2.2.7 怎样进行内存管理
  • 2.3 UI树及运行时游戏对象
  • 2.3.1 位置与变换
  • 2.3.2 坐标系
  • 1.世界坐标系
  • 2.本地坐标系
  • 3.坐标变换
  • 2.3.3 UI树
  • 1.UI树的遍历
  • 2.逻辑深度
  • 3.模型视图变换矩阵
  • 4.运行时游戏对象
  • 2.3.4 UI元素与内存管理
  • 2.4 应用程序架构
  • 2.4.1 游戏生命周期
  • 2.4.2 窗口尺寸
  • 2.4.3 场景管理
  • 2.4.4 游戏循环
  • 2.5 实时更新游戏对象
  • 2.5.1 帧率
  • 2.5.2 Scheduler
  • 2.5.3 时间线
  • 2.5.4 逻辑更新优先级
  • 2.5.5 性能问题
  • 2.6 Cocos2d-x的主线程
  • 2.6.1 在主线程中执行异步处理
  • 2.6.2 纹理的异步加载
  • 2.6.3 异步处理的单元测试
  • 2.7 本章小结
  • 第3章 OpenGL ES 2.0概览
  • 3.1 图形处理器简介
  • 3.2 什么是OpenGL ES
  • 3.3 OpenGL ES 2.0渲染管线
  • 3.3.1 顶点数组
  • 3.3.2 顶点着色器
  • 3.3.3 图元装配
  • 3.3.4 光栅化
  • 3.3.5 片段着色器
  • 3.3.6 片段测试
  • 3.4 渲染管线中的并行计算
  • 3.5 构建高性能的渲染引擎
  • 3.6 帧缓冲
  • 3.7 本章小结
  • 第4章 全新的绘制系统
  • 4.1 新绘制系统的特点
  • 4.2 绘制系统概览
  • 4.3 RenderCommand
  • 4.4 RenderQueue
  • 4.5 GroupCommand
  • 4.6 Render
  • 4.6.1 RenderCommand的排序
  • 4.6.2 QuadCommand
  • 4.7 元素的可见性
  • 4.8 绘制的时机
  • 4.9 示例:自定义RenderCommand
  • 4.10 本章小结
  • 第5章 纹理
  • 5.1 光栅化
  • 5.1.1 多重采样
  • 5.1.2 纹理坐标
  • 5.2 像素矩形
  • 5.2.1 像素存储模式
  • 5.2.2 纹理数据的传输
  • 5.2.3 解包
  • 5.3 客户端图像格式
  • 5.3.1 纹理格式的对应关系
  • 5.3.2 图像数据格式转换
  • 5.4 纹理对象和加载纹理
  • 5.5 纹理单元与多重纹理
  • 5.6 纹理缩放
  • 5.6.1 纹理缩小
  • 5.6.2 纹理放大
  • 5.6.3 在Cocos2d-x中设置过滤模式
  • 5.7 多级纹理
  • 5.7.1 多级纹理过滤模式
  • 5.7.2 多级纹理的上传
  • 5.7.3 多级纹理的生成
  • 5.8 纹理压缩
  • 5.8.1 压缩纹理的特点
  • 5.8.2 压缩纹理的实现
  • 5.8.3 在Cocos2d-x中使用压缩纹理
  • 5.8.4 PVRTC和PVRTC2
  • 5.8.5 ETC
  • 5.8.6 针对不同设备使用不同的压缩纹理
  • 5.9 纹理缓存管理
  • 5.9.1 纹理的生命周期
  • 5.9.2 用TextureCache来管理纹理
  • 5.9.3 场景过渡中的资源管理
  • 1.基于引用计数的资源管理
  • 2.更好的场景过渡资源管理
  • 5.9.4 Android下的纹理恢复处理
  • 5.10 纹理所占内存的计算
  • 5.11 使用纹理最佳实践
  • 5.11.1 硬件层面
  • 5.11.2 程序层面
  • 5.11.3 资源层面
  • 5.12 本章小结
  • 第6章 精灵
  • 6.1 用Sprite绘制一个矩形区域
  • 6.1.1 V3F_C4B_T2F_Quad结构体
  • 6.1.2 使用QuadCommand进行绘制
  • 6.1.3 将Sprite作为子元素
  • 6.2 Sprite的绘制属性
  • 6.2.1 颜色混合
  • 1.源、目标和缓冲区
  • 2.混合计算
  • 3.混合与深度测试
  • 6.2.2 颜色叠加
  • 1.Node的颜色叠加
  • 2.精灵的颜色叠加
  • 6.3 Alpha预乘
  • 6.4 精灵表
  • 6.5 精灵动画
  • 6.6 批绘制还是自动批绘制
  • 6.6.1 SpriteBatchNode
  • 6.6.2 TextureAtlas
  • 6.6.3 SpriteBatchNode的特点和限制
  • 6.7 部分拉伸:九宫格
  • 6.8 本章小结
  • 第7章 OpenGL ES着色语言
  • 7.1 概览
  • 7.2 基础类型
  • 7.2.1 空类型
  • 7.2.2 布尔类型
  • 7.2.3 整型
  • 7.2.4 浮点型
  • 7.2.5 矢量
  • 7.2.6 矩阵
  • 7.2.7 采样器
  • 7.2.8 结构体
  • 7.2.9 数组
  • 7.3 存储限定符
  • 7.3.1 默认限定符
  • 7.3.2 常量限定符
  • 7.3.3 属性限定符
  • 7.3.4 全局限定符
  • 7.3.5 易变量限定符
  • 7.4 构造器
  • 7.4.1 标量的转换构造
  • 7.4.2 矢量和矩阵构造器
  • 7.4.3 结构体构造器
  • 7.5 矢量的分量
  • 7.6 矩阵的分量
  • 7.7 结构体和成员
  • 7.8 矢量和矩阵操作符
  • 7.9 本章小结
  • 第8章 OpenGL ES着色程序
  • 8.1 顶点和顶点数组
  • 8.1.1 图元与顶点
  • 8.1.2 顶点属性状态
  • 8.1.3 顶点数组
  • 1.顶点数组数据结构
  • 2.在顶点着色器中定义属性
  • 3.顶点属性的绑定
  • 4.顶点数组的传输
  • 8.2 顶点缓冲对象
  • 8.2.1 顶点数组缓冲对象
  • 8.2.2 索引数组缓冲对象
  • 8.2.3 使用VAO缓存顶点数组状态
  • 8.3 着色器程序
  • 8.3.1 着色器程序字符串
  • 8.3.2 着色器的加载和编译
  • 8.3.3 着色器程序对象
  • 8.4 Cocos2d-x着色器子系统
  • 8.4.1 GLProgram与Node之间的关系
  • 8.4.2 GLProgramState
  • 1.设置顶点属性
  • 2.设置全局属性
  • 8.4.3 着色器程序的使用过程
  • 8.4.4 GLProgramState的管理
  • 8.4.5 GLProgramState的限制
  • 8.5 顶点着色器
  • 8.5.1 输入参数
  • 8.5.2 顶点坐标输出参数
  • 8.5.3 易变量输出参数
  • 8.6 片段着色器
  • 8.6.1 输入参数
  • 8.6.2 纹理采样
  • 8.6.3 输出参数
  • 8.7 着色器编辑工具
  • 8.8 示例
  • 8.8.1 使用ETC压缩纹理
  • 8.8.2 动态设置着色器参数
  • 8.9 着色器程序最佳实践
  • 8.10 本章小结
  • 第9章 帧缓冲
  • 9.1 GroupCommand
  • 9.1.1 使用GroupCommand的流程
  • 9.1.2 GroupCommand的限制
  • 9.2 帧缓冲
  • 9.2.1 绑定和管理帧缓冲
  • 9.2.2 将图像附加到帧缓冲
  • 9.2.3 渲染缓冲对象
  • 9.2.4 将Renderbuffer附加到帧缓冲
  • 9.2.5 将Texture附加到帧缓冲
  • 9.2.6 帧缓冲完成状态
  • 1.帧缓冲附加点完成状态
  • 2.帧缓冲完成状态
  • 3.完成状态对帧缓冲操作的影响
  • 9.3 RenderTexture
  • 9.3.1 RenderTexture的初始化
  • 9.3.2 RenderTexture的绘制
  • 9.3.3 ReadPixels
  • 9.3.4 RenderTexture的限制及用途
  • 9.4 本章小结
  • 第10章 片段操作
  • 10.1 片段操作简述
  • 10.2 逻辑缓冲区
  • 10.2.1 位平面
  • 10.2.2 按位计算
  • 1.移位运算符
  • 2.逻辑按位运算符
  • 10.3 片段测试
  • 10.3.1 模板测试
  • 10.3.2 深度测试
  • 10.3.3 模板测试的步骤
  • 10.3.4 片段测试的用途
  • 1.深度测试的用途
  • 2.模板测试的用途
  • 10.4 全缓冲区操作
  • 10.4.1 控制缓冲区的更新
  • 10.4.2 清理缓冲区
  • 10.5 ClippingNode
  • 10.5.1 ClippingNode的绘制流程
  • 10.5.2 ClippingNode的模板测试分析
  • 10.6 本章小结
  • 第11章 多分辨率支持
  • 11.1 概述
  • 11.2 设计分辨率
  • 11.2.1 缩放策略
  • 11.2.2 调整元素位置
  • 11.2.3 几个有用的变量
  • 11.2.4 使用屏幕分辨率
  • 11.2.5 视口设置
  • 11.2.6 什么时候缩放了
  • 11.3 资源分辨率
  • 11.3.1 资源分辨率的设置
  • 11.3.2 真实分辨率InPixels
  • 11.3.3 什么时候缩放资源
  • 11.4 本章小结
  • 第12章 事件分发
  • 12.1 概述
  • 12.1.1 什么是事件
  • 12.1.2 事件的工作机制
  • 12.1.3 事件系统的特点
  • 12.2 订阅者
  • 12.2.1 事件类型
  • 12.2.2 注册与管理订阅者
  • 1.注册订阅者
  • 2.删除订阅者
  • 3.修改订阅者
  • 12.3 事件的分发
  • 12.3.1 订阅者的排序
  • 12.3.2 嵌套事件
  • 12.3.3 在事件分发中修改订阅者
  • 12.3.4 停止分发事件
  • 12.4 事件与Node
  • 12.4.1 暂停与恢复
  • 12.4.2 删除订阅者
  • 12.5 触摸事件
  • 12.5.1 EventListenerTouchAllAtOnce
  • 12.5.2 EventListenerTouchOneByOne
  • 12.5.3 单点和多点触摸之间的关系
  • 12.5.4 触摸点的位置判断
  • 12.5.5 可见性与触摸事件
  • 12.6 其他
  • 12.6.1 其他操作系统事件
  • 12.6.2 EventCustom
  • 12.6.3 内存管理
  • 12.6.4 回调与返回值
  • 12.6.5 单元测试
  • 12.6.6 其他事件
  • 12.7 本章小结
  • 第13章 字体的故事
  • 13.1 计算机字体的历史
  • 13.2 轮廓字形概述
  • 13.2.1 点
  • 13.2.2 轮廓
  • 13.2.3 轮廓的方向
  • 13.2.4 轮廓的交叉
  • 13.2.5 混合轮廓字形
  • 13.2.6 字形格子
  • 13.3 FreeType字体引擎
  • 13.3.1 字体文件及字形索引
  • 13.3.2 字符度量
  • 13.3.3 FreeType字形解析过程
  • 13.3.4 FreeType字形装载
  • 1.FT_Library类
  • 2.FT_Face类
  • 3.FT_Size类
  • 4.FT_GlyphSlot类
  • 5.FT_CharMap类
  • 13.4 FontAtlas
  • 13.4.1 Font
  • 1.FontFreeType
  • 2.FontFNT
  • 3.FontCharMap
  • 13.4.2 FontAtlasCache
  • 13.5 Label
  • 13.5.1 通用属性
  • 1.几种尺寸
  • 2.对齐方式
  • 3.行高和字间距
  • 4.字符精灵
  • 13.5.2 Font字符集
  • 13.5.3 轮廓字体的缩放
  • 13.5.4 特效
  • 1.阴影
  • 2.描边
  • 3.发光
  • 13.6 使用字体的最佳实践
  • 第14章 动画系统
  • 14.1 概述
  • 14.2 线性插值
  • 14.2.1 标量插值
  • 14.2.2 矢量插值
  • 14.2.3 变换矩阵插值
  • 14.2.4 插值在动画系统中的运用
  • 14.3 给元素添加动画
  • 14.3.1 Action是一个自描述的对象
  • 14.3.2 在Node上执行动画
  • 1.取消正在执行的动画
  • 2.动画完成时回调
  • 3.命名动画
  • 14.3.3 控制动画的动画
  • 1.Sequence
  • 2.Spawn
  • 3.Repeat和RepeatForever
  • 14.4 动画系统架构
  • 14.4.1 Speed
  • 14.4.2 缓动函数
  • 14.4.3 自定义动画——精灵闪白
  • 1.混合着色器
  • 2.混合动作
  • 3.使用动作
  • 14.5 本章小结
  • 第15章 碰撞及物理引擎
  • 15.1 物理引擎概述
  • 15.2 碰撞检测系统
  • 15.2.1 刚体
  • 1.刚体的分类
  • 2.形状
  • 15.2.2 接触和碰撞
  • 1.刚体和形状的类别
  • 2.接触掩码
  • 3.碰撞掩码
  • 4.接触回调
  • 5.碰撞过程总结
  • 15.2.3 碰撞查询
  • 15.3 刚体动力学
  • 15.3.1 控制刚体的运动
  • 15.3.2 碰撞响应
  • 1.冲量碰撞响应
  • 2.摩擦力
  • 3.环境阻力
  • 4.休眠
  • 15.3.3 约束
  • 15.4 整合物理引擎
  • 15.4.1 刚体与可视对象
  • 1.驱动的刚体
  • 2.游戏驱动的刚体
  • 15.4.2 物理世界
  • 15.4.3 游戏循环阶段
  • 15.5 预处理与工具
  • 15.6 本章小结
  • 第16章 运行时游戏对象模型
  • 16.1 概述
  • 16.2 运行时游戏对象模型
  • 16.2.1 以对象为中心的架构
  • 1.复杂的层次结构
  • 2.分类学瓶颈
  • 3.多重继承
  • 4.冒泡效应
  • 5.无止境地重构
  • 16.2.2 组件模型
  • 1.把继承改为合成
  • 2.组件的创建及拥有权
  • 16.2.3 以属性为中心的架构
  • 1.通过属性类实现
  • 2.通过脚本实现
  • 3.以属性为中心设计的优缺点
  • 16.3 Entity Component System
  • 16.3.1 属性结构
  • 16.3.2 分离数据与行为
  • 16.3.3 数据驱动
  • 1.属性值
  • 2.对象结构
  • 3.事件脚本
  • 16.4 对象查询与消息通信
  • 16.4.1 根据唯一标识符查询
  • 16.4.2 根据类型查询
  • 16.4.3 面向类型编程
  • 16.4.4 游戏对象数据库
  • 16.5 实时更新游戏对象
  • 16.5.1 更新的性能优化
  • 16.5.2 更新的时序
  • 1.更新优先级
  • 2.桶式更新
  • 16.6 本章小结
  • 第17章 Genius-x开源框架
  • 17.1 Genius-x是什么
  • 17.1.1 Genius-x架构一览
  • 1.引擎无关性
  • 2.事件分发
  • 3.资源格式,加载
  • 4.资源串流
  • 5.运行时游戏对象模型
  • 6.工具类
  • 7.游戏性系统
  • 8.社区共享组件
  • 9.脚本支持
  • 10.编辑器
  • 17.1.2 Genius-x项目结构及使用
  • 17.2 游戏对象模型
  • 17.2.1 Entity
  • 1.唯一标识符
  • 2.对象的创建
  • 3.对象的销毁
  • 4.交通枢纽
  • 17.2.2 Component
  • 1.组件类型
  • 2.组件包含数据
  • 3.数据解析
  • 4.向游戏对象添加组件
  • 5.数据定义
  • 17.2.3 System
  • 1.System实例
  • 2.构造函数
  • 3.自动附加
  • 4.生命周期
  • 5.更新状态
  • 6.行为事件
  • 17.2.4 ECSManager
  • 1.注册组件
  • 2.ECSManager实例
  • 3.更新组件
  • 4.递归性
  • 17.2.5 数据驱动
  • 1.数据驱动的流程
  • 2.一个典型的数据驱动实例
  • 3.事件驱动
  • 17.2.6 NodeCom
  • 1.可视
  • 2.视组件的绘制
  • 3.移除可视组件
  • 4.唯一入口
  • 17.2.7 对象的层级结构
  • 17.3 数据格式、加载及串流
  • 17.3.1 数据格式
  • 1.ResourceDataDelegate是一个解析器
  • 2.ResourceDataDelegate是一个数据类
  • 3.注册数据类
  • 17.3.2 文件加载和管理
  • 17.3.3 游戏世界的串流
  • 1.引用计数管理
  • 2.统一的资源入口
  • 17.4 游戏通用系统
  • 17.5 共享组件
  • 17.6 示例
  • 第18章 脚本
  • 18.1 脚本的概念
  • 18.1.1 脚本语言的特征
  • 18.1.2 Lua脚本语言
  • 18.1.3 脚本所需的架构
  • 1.回调脚本
  • 2.事件处理器脚本
  • 3.以脚本扩展游戏对象类型或定义新类型
  • 4.组件或属性脚本
  • 5.脚本驱动的引擎系统
  • 6.脚本驱动的游戏
  • 18.2 运行时脚本语言的功能
  • 18.2.1 对原生编程语言的接口
  • 18.2.2 游戏对象句柄
  • 1.Lua函数调用与定义
  • 2.类对象及注册表
  • 3.tolua
  • 4.调用游戏对象方法
  • 18.2.3 在脚本中接收及处理事件
  • 1.通信机制
  • 2.向宿主程序注册Lua函数地址
  • 3.在宿主程序中调用Lua函数
  • 4.更好地组建脚本架构
  • 18.2.4 发送事件
  • 18.2.5 面向对象脚本语言
  • 18.3 Lua bindings
  • 18.3.1 生成绑定代码
  • 18.3.2 在程序中使用绑定代码
  • 18.3.3 自定义绑定
  • 18.4 在Lua中使用Genius-x
  • 18.4.1 配置环境
  • 18.4.2 创建Component脚本
  • 18.4.3 创建System脚本
  • 18.4.4 其他接口
  • 18.5 本章小结
  • 参考文献
展开全部