第1章 Cocos2d-x 起航
1.3 从2.x到3.x
- 使用新的C++11标准
- 渲染树修改成渲染队列
- 命名风格变化
- 重构了消息机制,从委托模式调整为监听者模式
- 新增了3D相关的功能
- 容器重做,废弃了原先自定义的系列容器,直接封装了STL容器使用
- 简化跨平台项目创建和打包的流程。
- 在Node中封装了物理引擎,但这个封装并不恰当。
- 提供了全局ZOrder顺序,同时关联到渲染和点击触碰。
1.4 约定
- 摒弃了匈牙利命名法。
1.5 起航
1.5.1 Windows
头文件路径、库文件路径,以及指定链接库文件,这3个问题与对应的一些错误将伴随着初学者,这里简单整理一下:
- C1083: Cannot open includefile: xxx.h No such file or directory。
- LNK1104: 无法解析的外部符号。
- LNK1104: 无法打开文件 xxoo.lib。
1.5.4 Cocos 引擎
- 在最熟悉的环境下编码,以提高开发效率,了解各个平台,对处理跨平台编译、打包和开发都有很大的帮助。
第2章 使用Cocos2d-x
在使用一种新技术之前,先从整体上简单了解这种技术,会让你少走一些弯路。
轻量级游戏引擎:
- GDI
- OpenGL
- DirectX
- HGE
2.1 Cocos2d-x 世界
- 常用的3种编写逻辑的方法。
- 在节点自动回调方法内写逻辑,init(),onEnter(),onExit()
- 使用调度器来定时执行逻辑,update()
- 指定事件发生之后的回调
- 获取输入:Cocos2dx至少封装了两层。
- 第一层是平台相关的输入接口。
- 第二层是Cocos2dx消息处理层。
第3章 低级错误大全
- create和retain-release;
- 继承对象的create;
- 多个对象执行同一个Action;
- 忘记调用父类的虚函数;
- 隐藏在代码中的神秘杀手,节点中的节点操作;
- 普通对象和new出来的对象;
- 不要忘记init;
- addChild失败;
- 在onEnter中调用parent的addChild;
- 忘记移除;
- 重载draw注意事项;
- 关于引用;
- 关于命名空间;
- 关于类之间的相互包含;
- 关于平台相关的API;
- 关于update中写逻辑;
- 关于调试;
第4章 图解指针
4.1 指针与内存
- 经典问题:const 指针和指向 const 对象的指针。
- 辨别技巧:
*
号前面是指针的类型,*
号后面是对指针的修饰。 - 所以
const char* p1;
与char const* p2
一样,都是不可改变所指对象的指针变量。
4.2 指针操作
- 指针的操作有基本操作和与指针类型挂钩的操作:
- 挂钩操作:
->
。可以操作对象的成员变量和成员函数。 - 基本操作:
- 解引用:
*
。效果相当于把指针变成对象来用。 - 算数运算操作:
+
、-
、++
、--
。1单位的偏移量具体是多少?是根据指针类型来定的! - 分配和释放:
new
、delete
、new[]
、delete[]
- 赋值操作符:
=
- 判断操作符:
==
、!=
- 解引用:
4.3 指针与数组
- 数组(名)本身就是一个指针。
- 不同的是
sizeof(a)
返回的是数组的大小4*4,而sizeof(p)
返回的是4。前者待检验。 - 二维数组和二级指针用的比较少。
- 用
int* p
来指定二级指针b,可以用p来取出二维数组中的所有元素。例如*p
取(0,0),*(p+4)
取(1,0)。 - 有待检验,如果可以的话,用二级指针b本身能否执行同样的操作?
4.4 函数指针
- 普通函数指针能看懂,成员函数指针第一次接触到,有点头晕。
- 定义函数和执行函数都有些不一样。
- Q:为什么普通函数被用作赋值的时候没有&符号,而成员函数指针要加
&
。
4.5 野指针和内存泄漏
- 空指针:使用空指针会报异常。解决办法:使用前判断非空。
- 野指针:指向垃圾内存(可能是随机地址),非空判断拦不住野指针。解决办法:声明不赋值时指向NULL,释放内存后也指向NULL。
- 内存泄漏:堆内存中新建出来的内存没有被释放,很难被发现,服务端程序因运行时间长会严重一点。解决办法:靠程序员自身。检测办法:在对象的构造函数和析构函数中来统计,创建了多少对象,释放了多少对象,程序运行结束后查看日志。
// 定义静态变量
static int gGameObjectCount = 0;
// 构造函数打印统计
CGameObject::CGameObject(void)
{
CCLog("CGameObject count %d", ++gGameObjectCount);
}
// 析构函数打印统计
CGameObject::~CGameObject(void)
{
CCLog("~CGameObject count %d", --gGameObjectCount);
}
第5章 C++11简介
- 初始化列表:简化代码。
std::initializer_list
,类、函数、标准容器都可以使用。 - 类型推导:
auto
和decltype
。 - 范围推导:
for(int &i : arr)
简化for循环代码。 - 智能指针和空指针:智能指针是类而非一般指针。空指针
nullptr
类型为nullptr_t
,解决了NULL
二义性问题。不能隐式转换为整数,不能和整数作比较。
void foo(char*);
void foo(int);
foo(NULL); // 执行的是foo(int)
foo(nullptr); // 执行的是foo(char*)
- Lambda特性:
- 变长参数模板:
- 右值引用:
- 显式虚函数重载: