v3.0 亮点
使用 C++(C++11) 的特性取代了 Objective-C 的特性
优化了 Labels
优化了渲染器(比 v2.2 更快)
新的事件分发机制
物理引擎集成
新的 UI 对象
支持远程控制台
重构 Image - 及时释放内存,统一了支持文件格式的 API
自动生成 Lua 绑定,添加了 LuaJavaBridge 和 LuaObjcBridge
模板容器
使用 cocos2d::Map<> 替代了 CCDictionary , 用法
使用 cocos2d::Vector<> 替代了 CCArray, 用法
使用 cocos2d::Value 替代了 CCBool, CCFLoat, CCDouble, 用法
细节
C++11 特性
从 v3.0-pre-alpha0 开始,这些特性被添加
C++11 的一部分特性已经被使用到 cocos2d-x 中了:
std::function, 包含了回调中使用的 lambda 对象
对于大多数的 cocos2d-x 枚举和常量采用了强类型枚举
在线程中使用了 std::thread
对于 Override 和 final 方法,增加了 override 和 final 上下文关键字
std::function
CallFunc 可以由 std::function 来创建
CallFuncN 可以由 std::function 来创建
CallFuncND 和 CallFuncO 已经被移除了因为它们可以类似地由 CallFuncN 和 CallFunc 来创建. 可以查看示例中的 ActionsTest.cpp 文件
MenuItem 支持 std::function 作为回调
CallFunc 示例:
//v2.1 版本
CCCallFunc *action1 = CCCallFunc::create( this, callfunc_selector( MyClass::callback_0 ) );//v3.0 版本 (短版本)
auto action1 = CallFunc::create( CC_CALLBACK_0(MyClass::callback_0,this));
auto action2= CallFunc::create( CC_CALLBACK_0(MyClass::callback_1,this, additional_parameters));//v3.0 版本 (长版本)
auto action1 = CallFunc::create( std::bind( &MyClass::callback_0, this));
auto action2= CallFunc::create( std::bind( &MyClass::callback_1, this, additional_parameters));//v3.0 中你也可以使用lambda表达式或者其他函数对象
auto action1 =CallFunc::create(
[&](){
auto s= Director::sharedDirector()->getWinSize();
auto label= LabelTTF::create("called:lambda callback", "Marker Felt", 16);
label->setPosition(ccp( s.width/4*1,s.height/2-40));this->addChild(label);
} );
MenuItem 示例:
//v2.1 版本
CCMenuItemLabel *item = CCMenuItemLabel::create(label, this, menu_selector(MyClass::callback));//v3.0 版本 (短版本)
auto item = MenuItemLabel::create(label, CC_CALLBACK_1(MyClass::callback, this));//v3.0 版本 (长版本)
auto item = MenuItemLabel::create(label, std::bind(&MyClass::callback, this, std::placeholders::_1));//v3.0 中你也可以使用lambda表达式或者其他函数对象
auto item =MenuItemLabel::create(label,
[&](Object *sender) {//do something. Item "sender" clicked
});
强类型枚举
从 v3.0-pre-alpha0 开始,这些特性被添加
以 k 开头的常量和枚举量,通常被定义为 int 或者简单的 enum 类型,现在已经被强类型枚举(enum class)所替代,这样有利于避免冲突和类型错误。
新的格式是:
| v2.1 | v3.0 |
| kTypeValue | Type::VALUE |
示例:
| v2.1 | v3.0 |
| kCCTexture2DPixelFormat_RGBA8888 | Texture2D::PixelFormat::RGBA8888 |
| kCCDirectorProjectionCustom | Director::Projection::CUSTOM |
| ccGREEN | Color3B::GREEN |
| CCPointZero | Point::ZERO |
| CCSizeZero | Size::ZERO |
旧的值仍然是可以使用的,但是已经被标记为 deprecated.
覆盖
为了捕获覆盖方法中可能出现的错误,子类的覆盖方法添加了 override 的关键字。
示例:
class Sprite : publicNode {bool isFlipY(void) const;void setFlipY(boolbFlipY);//Overrides
virtual void setTexture(Texture2D *texture) override;virtual Texture2D* getTexture() const override;
inlinevoid setBlendFunc(const BlendFunc &blendFunc) override;
inlineconst BlendFunc& getBlendFunc() const override;
}
去OC化
从 v3.0-pre-alpha0 开始,这些特性被添加
移除C++类的“cc”前缀以及free functions
类的变更
因为 cocos2d-x 已经使用了 cocos2d 的命名空间,因此也就不需要在所有的类中添加 CC 的前缀。 示例:
| v2.1 | v3.0 |
| CCSprite | Sprite |
| CCNode | Node |
| CCDirector | Director |
| etc... |
v2.1 类名仍然有效,但是已经被标记为 deprecated。
free function