声明:Cocos2dx引擎笔记系列仅仅作为个人的学习记录、便于查看学习,源内容完全来自Cocos2d-x官网。
Cocos2d-x是MIT许可证下发布的开源游戏引擎,游戏开发快速、简易、功能强大。Cocos2d-x核心优势在于允许开发人员利用C++、Lua及Javascript来进行跨平台部署,覆盖平台包括iOS、Android、Windows Phone、黑莓(BlackBerry)及Tizen等等,省事省力省成本。
Cocos2d-x用户不仅包括个人开发者和游戏开发爱好者,还包括许多知名大公司如Zynga、Wooga、Gamevil、Glu、GREE、Konami、TinyCo、HandyGames、IGG及Disney Mobile等。截止2013年9月,全球基于Cocos2d-x引擎的游戏下载量高达逾15亿,其中许多还占据苹果应用商店(AppStore)和谷歌应用商店(Google Play)排行榜。同时许多公司如触控、谷歌、微软、ARM、英特尔及黑莓的工程师在Cocos2d-x领域也非常活跃。
自2012年3月,Cocos2d-html5成为Cocos2d-x旗下分支游戏引擎,针对台式电脑、平板电脑及手机中支持HTML5的浏览器而设计。
Cocos2d系列产品关系
自Cocos2d-iPhone取得成功后,Cocos2d系列产品已经推出许多子项目。这里列出了一些最为出名的旗下分支游戏引擎。
蓝色方框中的分支引擎(包括Cocos2d-iPhone,Cocos2d-x,Cocos2d-HTML5及Cocos Builder 编辑器)在同一路径图上合作运行,并已发布协调版本。这意味着开发人员可以期待一条完整的工具链为网络设备或移动设备开发多平台游戏。从下表可知,不同分支引擎支持不同的目标平台并使用不同的编程语言。
分支引擎 | 编程语言 | 平台 | |
---|---|---|---|
Cocos2d | Python | 桌面操作系统 | |
Cocos2d-iphone | Objective-C,JavaScript | iOS | |
C++,Lua,70)"> 参见支持平台和编程语言部分 | |||
JavaScript | 支持HTML5的浏览器 | ||
Ruby | Cocos2d-windows | C++ | Windows XP/7 |
Java | Android | ||
Cocos2d-xna | C# | Microsoft and MonoGame platforms | |
Cocos-net | Mono-supported 平台 | ||
Objective-C | iOS |
支持平台和编程语言
“o”代表支持并能正常工作, “i”代表支持但不在主干版本内,可以从历史版本里面找到 。“w”代表正在研发
Cocos2d-x
平台 | C++ | Lua | Javascript | ||||||
---|---|---|---|---|---|---|---|---|---|
移动平台 | iOS | o | o | ||||||
Android | WindowsPhone8 | ||||||||
i | Marmalade | 桌面平台 | win32 | Linux | Mac OS X | Win8 Metro | Native Client | Emscripten |
Cocos2d-html5
Canvas | WebGL | |||
---|---|---|---|---|
FireFox | Safari | IE 9及以上版本 | 移动浏览器 | i |
o |
架构和目录结构
1. Cocos2d-x
1.1 架构
1.2目录结构
从github下载Cocos2d-x repo资源包后,或解压稳定版ZIP压缩包后,就会看到如下的目录结构:
说明 |
---|
音频支持。注意:Android平台中背景音乐和短音效所使用的系统API不同。 |
Cocos2d-x框架的主目录。 |
你可以下载doxygen文档系统,利用该系统打开本文档文件夹内的doxygen.config文件,然后再生成离线API文档。 |
如果需要更多图形用户界面的控制功能、网络访问、CocosBuilder支持甚至2.5D功能,你可以使用using namespace cocos2d::extension。 |
包括Box2d及Chipmunk库。 |
cocos2d依赖很多其他开源项目。所有授权许可文件都在这个目录。 |
重要!这是你该开始用到的文件。从Cpp/HelloCpp开始学习,你会在TestCpp中发现所有类的用法。lua和js样本也在这个目录。 |
我知道你不喜欢C++,写起来太复杂。没问题,我们有Lua和Javascript。Scripting文件夹包括来自火狐的lua官方引擎和SpiderMonkey引擎。 |
该目录包括在不同集成开发环境及不同平台中创建Cocos2d-x新项目的模板。这里汇集了数量庞大覆盖各种开发环境和平台的模板! |
包括将C++绑定至lua及javascript的脚本文件。 |
作者修订记录文档。 |
配套Visual Studio 2010打开。注意:VS 2008自Cocos2d-x v2.0版本以来就不再支持。 |
配套Visual Studio 2012打开。 |
在Windows平台运行。具体用法请参考如何用脚本创建Android项目。 |
在Linux或OS X平台运行。具体用法请参考如何用脚本创建Android项目。 |
执行该文件安装后,你可以在Visual Studio中创建空的Cocos2d-x项目。 |
执行该文件安装后,你可以在Xcode中创建空的Cocos2d-x项目。 |
2. Cocos2d-html5
2.1 架构
2.2 目录结构
音频支持。注意:你至少需要两种音频格式以支持所有浏览器。 |
---|
主目录,包括所有主目录文件及与Cocos2d-x及Cocos2d-iPhone一样的API。平台兼容性佳! |
V2.1a版本的Box2dweb Physics引擎。 |
无版本号的Chipmunk Physic引擎 |
包括几个demo程序,你可以从这些demo程序入手。 |
预备的一个Hello World程序,你可以从这入手。 |
包括一个MIN版本的引擎,当你使用ant工具运行/cocos2d/build.xml文件时,会将所有引擎文件打包成一个文件。 |
Cocos2d-html5索引文件。 |
作者列表 |
3. Javascript绑定
跨平台虽然很好,但还不够好。用C++语言编程不仅超级慢,C++代码还无法在网络浏览器中运行。这就是为什么我们选择增加Javascript绑定功能。通过JSB我们可以将javascript代码打包至:
- Cocos2d-x+SpiderMonkey上的本地应用,SpiderMonkey能将javascript代码解析成C语言。
- Cocos2d-html5上的网页应用。
我们在Cocos2d-iphone、Cocos2d-x 和Cocos2d-html5框架中使用的API组合是一样的。所以,我们可以百分之百在本地Cocos2d-x或Cocos2d-iphone中创建javascript游戏。当你要在浏览器上运行时,你只需要将引擎切换至Cocos2d-html5,而无需修改源代码。
优势:
- 编码速度要比C++快得多
- 无需处理野指针、引用计数及内存泄露的问题
- 跨越本地及网络平台
- 在线更新
Cocos API风格说明(适用版本:v3.0-beta2及更高版本)
一、两阶段构造器
1、第一阶段:C++类的默认构造器
作用: 设定成员变量默认值,但并不在构造函数中编写任何逻辑。(因为C++默认构造器不能返回表明我们逻辑正确与否的bool 值)
MyClass::MyClass():_data(NULL),_flag(false),_count(0){ memset(_array,sizeof(_array)); // only set default values here,but not logics }
虽然使用C++关键词try
/catch
(捕获/异常)可以给调用方返回失败状态,但是使用catch
显然将增加源代码编译后的二进制文件的大小。
bool MyClass::initWithFilename(const std::string& filename) { bool bReturnValue = loadTextureIntoMemory(filename); //加载失败时,会返回一个状态 return bReturnValue; }
所以,我们可以构建如下
MyClass* obj = new MyClass; if (true == obj->initWithFilename("texture.png")){ // 成功,继续 } else { // 初始化错误 }
在Cocos2d-x引擎中,已经对两阶段构造器进行了封装,封装在静态create()函数中。
二、静态函数create()
静态函数create()完成对两阶段构造器的封装。在静态create()函数中自动释放引用计数。除了单例类,每一个cocos2d类都有自己的static CCClass* CCClass::create(...)方法。极力推荐这一方法。代码样本:
Sprite* monster = Sprite::create("Monster.png"); monster->setPosition(ccp(visibleSize.width/2 + origin.x,visibleSize.height/2 + origin.y)); this->addChild(monster);
所以,如果你希望新建cocos2d的对象,比如Sprite,Label,Action,你必须首先从头文件或API文件中找到它的CocosClass::create() 方法。
static Scene* create(); class CC_DLL Scene : public Node { public: ... static Scene *create(); ... }; Scene* Scene::create() { Scene *ret = new Scene(); if (ret && ret->init()) { ret->autorelease(); return ret; } else { CC_SAFE_DELETE(ret); return nullptr; } }
doSomething()
第一个字是一个动词,第二个字是一个名词。比如:replaceScene(CCScene*)
和getTexture()
。
doWithResource()
它是doSomething()方法的变体。在initWithTexture(CCTexture*)
和initWithFilename(const std::string&)
中,你经常可以看见这一函数名。
onEventCallback()
当你看到类似void onEnter()
的函数名时,onAction
类型表明这是一个回调函数。当引发一定条件时,其他类将调用这一方法。比如:
class Layer { public: virtual void onEnter(); virtual void onExit(); virtual void onEnterTransitionDidFinish(); }
getInstance()
在Cocos2d-x引擎中,如果你没有发现create()
,只发现了getInstance()
方法,它就属于单例模式类。比如,TextureCache::getInstance()
。单例类对应的析构方式是destroyInstance()
。
在v3.0之前,单例类的构造方式是CocosClass::sharedCocosClass()
,比如TextureCache::sharedTextureCache()
。这个方法在v3.0中仍然可以兼容,但不保证在v3.0更后面的版本中仍然保留。
属性设置器
因为在C++ 和 C++11中没有"property" (“属性”)这个概念,所以我们在Cocos2d-x引擎中使用了许多getter和setters。
# setProperty()
改变属性的值。这通常会影响到对象的行为。比如_sprite->setPosition(ccp(0,0))
会将精灵移动到左下角。
# getProperty()
不会改变对象的成员变量及行为。比如,我们通常使用_director->getVisibleSize().width
获得可见大小或窗口大小以计算对象的方位。
getProperty()
函数的默认类型如下:
const CCSize& getSize() const;
首先,根据性能优化,在此,我们返回CCSize引用,而不是构建另一个CCSize。当改变这一CCSize&时,该对象的内部成员变量将会受到影响,所以这一CCSize&属于常量。
第二,getSize()方法不应改变该对象的其他成员变量,所以这一函数本身属于常量。
# isProperty()
和getProperty一样,但会返回一个boolean值。
总结起来:
- 如果属性为“只读”,将不会有
setProperty(type)
方法; - 如果属性为一个bool值,将会有
setProperty(bool)
及isProperty()
方法。 比如:Sprite::isDirty()
和Sprite::setDirty(bool bDirty)
。 - 如果属性不是一个bool值,将会有
setProperty(type)
和getProperty()
方法。比如:void Sprite::setTexture(Texture2D*)
和Texture2D* CCSprite::getTexture()
。