《精通Cocos2d-x游戏开发(基础卷)》读书笔记

第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特性:原以为理解了lambda了,结果还是头大,远远没有那么简单。
  • 变长参数模板:
  • 右值引用:
  • 显式虚函数重载:

第3章 增量更新

// project.manifest(放到Resource目录下)
{
    "packageUrl" : "http://localhost/test/",
    "remoteManifestUrl" : "http://localhost/test/project.manifest",
    "version" : "1.0.0",

    "assets" : {
        "play.png" : {
            "md5" : "123"
        }
    },
    "searchPaths" : [
    ]
}
// project.manifest(放到nginx/html/test目录下)
{
    "packageUrl" : "http://localhost/test/",
    "remoteManifestUrl" : "http://localhost/test/project.manifest",
    "version" : "1.0.1",

    "assets" : {
        "play.png" : {
            "md5" : "1234"
        }
    },
    "searchPaths" : [
    ]
}
// LoginScene.cpp
void LoginScene::onLoadEnd()
{
	auto backgroundSprite = Sprite::create("play.png");
	addChild(backgroundSprite, 1);
	backgroundSprite->setPosition(Director::getInstance()->getWinSize()*0.5f);
}

void LoginScene::updateAssetsFromWeb()
{
	// 3.1 增量更新
	string storage = FileUtils::getInstance()->getWritablePath() + "test1/";
	auto assetMgrEx = extension::AssetsManagerEx::create("project.manifest", storage);
	assetMgrEx->retain();
	auto amListener = cocos2d::extension::EventListenerAssetsManagerEx::create(assetMgrEx, [this](extension::EventAssetsManagerEx* event) {
		log("code = %d", event->getEventCode());
		switch (event->getEventCode())
		{
		case EventAssetsManagerEx::EventCode::ERROR_NO_LOCAL_MANIFEST:
			log("No local manifest file found, skip assets update.");
			this->onLoadEnd();
			break;
		case EventAssetsManagerEx::EventCode::ERROR_DOWNLOAD_MANIFEST:
		case EventAssetsManagerEx::EventCode::ERROR_PARSE_MANIFEST:
			log("Fail to download manifest file, update skipped.");
			this->onLoadEnd();
			break;
		case EventAssetsManagerEx::EventCode::UPDATE_FAILED:
			// 更新失败
			log("Update failed. %s", event->getMessage().c_str());
			this->onLoadEnd();
			break;
		case EventAssetsManagerEx::EventCode::ALREADY_UP_TO_DATE:
		case EventAssetsManagerEx::EventCode::UPDATE_FINISHED:
			log("Update finished. %s", event->getMessage().c_str());
			this->onLoadEnd();
			break;
		case EventAssetsManagerEx::EventCode::ERROR_UPDATING:
			// 更新资源失败
			log("Asset %s : %s", event->getAssetId().c_str(), event->getMessage().c_str());
			break;
		default:
			break;
		};
		void update();
		void downloadFailedAssets();
		//const Manifest* getLocalManifest() const;
	});
	Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(amListener, 1);
	assetMgrEx->update();
}




















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

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

精通Cocos2d-x游戏开发》分为《基础》和《进阶》两册。这两册都有明确的写作目的。《基础》专注于Cocos2d-x引擎基础,致力于让Cocos2d-x初学者成为一个基础扎实、靠谱的程序员。《进阶》专注于各种实用技术,是作者多年开发经验的结晶,书中的技术点大多是从实际工作中碰到的问题提炼而来的,从问题的本质出发到解决问题的思路,提供了多种解决方案,并对比各方案的优缺点,启发读者思考。 本书为《精通Cocos2d-x游戏开发》的《进阶》,共36章,分为4篇。第1篇为“实用技术篇”,主要内容有加密解密、增量更新、分辨率适配、调试技巧、Shader特效、裁剪遮罩、物理引擎、骨骼动画、CocoStudio最佳实践等实用技术。第2篇为“Lua篇”,主要内容有Lua的基础知识、Lua的table与面向对象、C/C++与Lua的通信、Cocos2d-x原生Lua框架与Quick-Cocos2d-xLua框架等。第3篇为“网络篇”,主要内容有网络基础、selectIO复用、Socket和Libcurl等基础知识,以及弱联网、强联网、局域网等网络游戏的客户端和服务端开发。第4篇为“跨平台篇”,主要内容有Android和iOS平台的开发和打包知识,以及如何使用AnySDK快速接入第三方SDK。 本书适合使用Cocos2d-x进行游戏开发的中高级读者阅读,尤其适合在使用Cocos2d-x开发过程中碰到问题的程序员,以及希望学习一些实用技术,从而丰富自身经验的程序员。对于大中专院校的学生和社会培训班的学员,本书也是一本不可多得的学习教程。
相关推荐
Cocos2d-x游戏开发》分为《基础》和《进阶》两个分册。两书籍都有明确的写作目的。《基础》专注于Cocos2d-x引擎基础,致力于让Cocos2d-x初学者成为一个基础扎实、靠谱的程序员。《进阶》专注于各种实用技术,是作者多年开发经验的结晶,书中的技术点大多是基于实际工作中碰到的问题提炼而来,从问题的本质出发到解决问题的思路,提供了多种解决方案,并对比各方案的优缺点,启发读者思考。 本书为《Cocos2d-x游戏开发》的《基础》,共31章,分为4篇。第1篇为《入门篇》,涵盖的主要内容有Cocos2d-x开发环境、学习建议、注意事项及低级错误总结,以及必备的C 编程基础和指针知识等。第2篇为《基础框架篇》,涵盖的主要内容有节点系统、内存管理、场景和层、精灵、动作系统、动画、纹理、文字、运行机制、渲染机制、消息机制和Schedule等。第3篇为《UI与交互篇》,涵盖的主要内容有触摸输入、文本输入、按钮与重力感应输入、Menu和MenuItem,以及GUI框架的功能控件、文本输入、文本显示及容器控件等。第4篇为《CocoStudio工具链篇》,涵盖的主要内容有CocoStudio的UI编辑器、场景编辑器、动画编辑器、2.x编辑器及CocosBuilder等。 本书适合学习Cocos2d-x游戏开发的零基础读者阅读,尤其适合Cocos2d-x自学人员。对于大中专院校的学生和社会培训班的学员,本书也是一本不可多得的学习教程。 第1篇 入门篇 第1章 Cocos2d-x启航 第2章 使用Cocos2d-x 第3章 低级错误大全 第4章 图解指针 第5章 C 11简介 第2基础框架篇 第6章 节点系统 第7章 内存管理 第8章 场景和层 第9章 精灵详解 第10章 动作系统 第11章 播放动画 第12章 纹理详解 第13章 显示文字 第14章 运行机制 第15章 渲染机制 第16章 消息机制 第17章 Schedule详解 第3篇 UI与交互篇 第18章 触摸输入 第19章 文本输入 第20章 按钮与重力感应输入 第21章 Menu和MenuItem详解 第22章 GUI框架概述 第23章 GUI框架之功能控件 第24章 GUI框架之文本输入和显示 第25章 GUI框架之容器控件 第4篇 CocoStudio工具链篇 第26章 CocoStudio概述 第27章 CocoStudio UI编辑器 第28章 CocoStudio场景编辑器 第29章 CocoStudio动画编辑器 第30章 CocoStudio 2.x编辑器 第31章 使用CocosBuilder 第1篇 实用技术篇 第1章 文件读写 22章 加密解密 15 第3章 增量更新 32 第4章 声音与音效 51 第5章分辨率适配 58 第6章CocoStudio最佳实践 68 第7章调试Cocos2d-x 78 第8章调试技巧总结 84 第9章物理引擎——Box2d基础 107 第10章物理引擎——应用到Cocos2d-x 126 第11章图元渲染 145 第12章Spine骨骼动画 151 第13章2D、3D粒子特效 172 第14章裁剪与遮罩 194 第15章使用Shader——GLSL基础 212 第16章使用Shader——常用特效 236 第2篇Lua篇 第17章Lua基础概述 248 第18章Lua——table 257 第19章Lua与C的通信 271 第20章Cocos2d-x原生Lua框架详解 284 第21章Cocos2d-xQuick框架详解 310 第22章Quick框架实践——MVC框架 325 第3篇网络篇 第23章网络游戏——网游开发概述 344 [3] 第24章弱联网游戏——Cocos2d-x客户端实现 347 第25章弱联网游戏——PHP服务器实现 36226章强联网游戏——TCP和Socket 369 第27章强联网游戏——单机版动作游戏 390 第28章强联网游戏——C++服务器实现 404 第29章网络游戏——前后端网络同步 414 第30章局域网游戏——使用UDP 423 第31章局域网游戏——建立、搜索、加入房间 430 第4篇跨平台篇 第32章Android环境搭建 440 第33章使用JNI实现C++与Java互调 461 第34章iOS环境搭建与真机调试 492 第35章Objective-C与C++互调 511 第36章接入AnySDK 515
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页