第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单位的偏移量具体是多少?是根据指针类型来定的!
    • 分配和释放:newdeletenew[]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,类、函数、标准容器都可以使用。
  • 类型推导:autodecltype
  • 范围推导:for(int &i : arr)简化for循环代码。
  • 智能指针和空指针:智能指针是类而非一般指针。空指针nullptr类型为nullptr_t,解决了NULL二义性问题。不能隐式转换为整数,不能和整数作比较。
void foo(char*);
void foo(int);
foo(NULL); // 执行的是foo(int)
foo(nullptr); // 执行的是foo(char*)
  • Lambda特性:
  • 变长参数模板:
  • 右值引用:
  • 显式虚函数重载:



















参考自《精通Cocos2d-x游戏开发(基础卷)》

仅限学习交流,如有侵权,请联系本人删除。

07-17 22:27