v3.0 亮點(diǎn)
@來自官網(wǎng)
使用 C++(C++11) 的特性取代了 Objective-C 的特性
優(yōu)化了 Labels
優(yōu)化了渲染器(比 v2.2 更快)
新的事件分發(fā)機(jī)制
物理引擎集成
新的 UI 對象
JavaScript 遠(yuǎn)程調(diào)試器
支持遠(yuǎn)程控制臺
使用 cocos console創(chuàng)建和運(yùn)行項(xiàng)目
重構(gòu) Image - 及時釋放內(nèi)存个扰,統(tǒng)一了支持文件格式的 API
自動生成 Lua 綁定,添加了 LuaJavaBridge 和 LuaObjcBridge
模板容器
使用 cocos2d::Map<> 替代了 CCDictionary , 用法
使用 cocos2d::Vector<> 替代了 CCArray, 用法
使用 cocos2d::Value 替代了 CCBool, CCFLoat, CCDouble, 用法
細(xì)節(jié)
C++11 特性
從 v3.0-pre-alpha0 開始,這些特性被添加
C++11 的一部分特性已經(jīng)被使用到 cocos2d-x 中了:
std::function, 包含了回調(diào)中使用的 lambda 對象
對于大多數(shù)的 cocos2d-x 枚舉和常量采用了強(qiáng)類型枚舉
在線程中使用了 std::thread
對于 Override 和 final 方法,增加了 override 和 final 上下文關(guān)鍵字
std::function
CallFunc 可以由 std::function<void()> 來創(chuàng)建
CallFuncN 可以由 std::function<void(Node)> 來創(chuàng)建
CallFuncND 和 CallFuncO 已經(jīng)被移除了因?yàn)樗鼈兛梢灶愃频赜?CallFuncN 和 CallFunc 來創(chuàng)建. 可以查看示例中的 ActionsTest.cpp 文件
MenuItem 支持 std::function<void(Node)> 作為回調(diào)
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表達(dá)式或者其他函數(shù)對象
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表達(dá)式或者其他函數(shù)對象
auto item = MenuItemLabel::create(label,
[&](Object *sender) {
// do something. Item "sender" clicked
});
強(qiáng)類型枚舉
從 v3.0-pre-alpha0 開始,這些特性被添加
以 k 開頭的常量和枚舉量,通常被定義為 int 或者簡單的 enum 類型,現(xiàn)在已經(jīng)被強(qiáng)類型枚舉(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 |
舊的值仍然是可以使用的兢仰,但是已經(jīng)被標(biāo)記為 deprecated.覆蓋
為了捕獲覆蓋方法中可能出現(xiàn)的錯誤乍丈,子類的覆蓋方法添加了 override 的關(guān)鍵字。
示例:
class Sprite : public Node {
bool isFlipY(void) const;
void setFlipY(bool bFlipY);
// Overrides
virtual void setTexture(Texture2D *texture) override;
virtual Texture2D* getTexture() const override;
inline void setBlendFunc(const BlendFunc &blendFunc) override;
inline const BlendFunc& getBlendFunc() const override;
}
去OC化
從 v3.0-pre-alpha0 開始把将,這些特性被添加移除C++類的“cc”前綴以及free functions類的變更因?yàn)?cocos2d-x 已經(jīng)使用了 cocos2d 的命名空間轻专,因此也就不需要在所有的類中添加 CC 的前綴。 示例:
| v2.1 | v3.0 |
| CCSprite | Sprite |
| CCNode | Node |
| CCDirector | Director |
| etc... |
v2.1 類名仍然有效察蹲,但是已經(jīng)被標(biāo)記為 deprecated请垛。
free functions 的變更對于 drawing primitives:
已經(jīng)被添加到 DrawPrimitives 命名空間
移除 cc 前綴
對于 gl proxy functions:
已經(jīng)被添加到 GL 命名空間
移除 ccGL 前綴
示例:
| v2.1 | v3.0 |
| ccDrawPoint() | DrawPrimitives::drawPoint() |
| ccDrawCircle() | DrawPrimitives::drawCircle() |
| ccGLBlendFunc() | GL::blendFunc() |
| ccGLBindTexture2D() | GL::bindTexture2D() |
| etc... |
v2.1 free functions 仍然有效,但已經(jīng)被標(biāo)記為 deprecated洽议。
使用 clone 替代 copy
clone() 返回了一份 autoreleased 版本的拷貝宗收。
copy() 不再被支持,如果你使用它亚兄,仍然是可以編譯的混稽,但是代碼會崩掉。
示例:
// v2.1
CCMoveBy action = (CCMoveBy) move->copy();
action->autorelease();
// v3.0
// 不需要使用autorelease审胚,也不需要做轉(zhuǎn)換
auto action = move->clone();
單例類采用了 getInstance 和 destroyInstance
所有的單例類使用 getInstance() 和 destroyInstance() (如果可用) 來獲取和摧毀實(shí)例匈勋。
Examples:
| v2.1 | v3.0 |
| CCDirector->sharedDirector() | Director->getInstance() |
| CCDirector->endDirector() | Director->destroyInstance() |
| etc... |
v2.1 方法仍然有效,但已經(jīng)被標(biāo)記為 deprecated膳叨。
使用了 Ref 代替了 Object:
因?yàn)?Object 容易讓人混淆洽洁,所以重命名為 Ref ,同時移除了和引用計數(shù)無關(guān)的函數(shù)懒鉴,之前所有繼承于 Object 的類現(xiàn)在都改為繼承于 Ref诡挂。
getters Getters 現(xiàn)在使用了 get 前綴。
示例:
| v2.1 | v3.0* |
| node->boundingBox() | node->getBoundingBox() |
| sprite->nodeToParentTransform() | sprite->getNodeToParentTransform() |
| etc... |
當(dāng)然 getters 在聲明中也被標(biāo)識為 const 临谱。 示例:
// v2.1
virtual float getScale();
// v3.0
virtual float getScale() const;
v2.1 方法仍然有效,但已經(jīng)被標(biāo)記為 deprecated奴璃。
POD 類型
接收 POD 類型作為參數(shù)的方法(比如:TexParams, Point, Size,等等)已經(jīng)修改為傳遞成 const 型引用悉默。
示例:
// v2.1
void setTexParameters(ccTexParams* texParams);
// v3.0
void setTexParameters(const ccTexParams& texParams);
新的渲染器
v3.0-beta 中,這些特性被添加苟穆, v3.0-beta2 中進(jìn)行了優(yōu)化
Cocos2d-x v2.2 中渲染方式是沒問題的抄课,但是它難以進(jìn)行優(yōu)化唱星,也難以添加新的功能和移植到新的平臺。 所以跟磨,Cocos2d-x v3.0 有了一個更威武间聊,更優(yōu)雅,更易擴(kuò)展抵拘,更靈活的新渲染器哎榴,但是它依舊很容易使用也很好理解。Cocos2d-x 的老用戶們將會發(fā)現(xiàn)新的API是如此的熟悉僵蛛,根本不需要去考慮底層做了什么改變和更新尚蝌,用起來仍然是這么的舒服。
新渲染器特性:
它已經(jīng)從 Scene Graph 中分離出來充尉,draw() 方法替代了 “drawing” 發(fā)送了一個 渲染命令 給 渲染器飘言,而 渲染器 負(fù)責(zé)繪制排隊的 渲染命令 。
QuadCommands (Sprite 和 ParticleSystem 對象使用) 將會自動進(jìn)行批處理驼侠。
CustomCommand 對象允許用戶自定義 OpenGL 代碼姿鸿,使用的 API 類似 v2.2。
GroupCommand 對象允許渲染器中擁有不同 OpenGL 值的“堆椀乖矗”般妙。
Sprite 的自動剔除功能(雖然從技術(shù)上講,自動剔除功能是表現(xiàn)在 Sprite 代碼上而不是 Renderer 代碼上)
全局 Z 軸順序 (局部 Z 軸順序仍然有效)
更多的細(xì)節(jié)信息相速,可以閱讀如下文檔: Renderer Specification document
渲染器特性
自動批處理
自動批處理功能意味著 渲染器將會把 多次繪制調(diào)用 打包為一次 大的繪制調(diào)用(AKA batch)碟渺。組合 繪制調(diào)用當(dāng)然需要滿足一定的條件:
它僅工作在 QuadCommand 命令下(由 Sprite 和 ParticleSystem 對象使用)
QuadCommadnds 必須共享相同的材質(zhì) ID :相同的紋理ID,相同的 GLProgram 和相同的混合功能
QuadCommands 必須是連續(xù)的
如果這些條件都滿足的話突诬,渲染器 將會使用所有這些 QuadCommand 對象創(chuàng)建一個批處理(一次繪制調(diào)用)苫拍。
如果你不熟悉 OpenGL 的使用,批處理對于您游戲的能否擁有一個流暢的運(yùn)行速度是很重要的旺隙,越少的批處理(繪制調(diào)用)越有利于您游戲的表現(xiàn)力绒极。
自動剔除
目前,自動剔除功能只在 Sprite 對象中實(shí)現(xiàn)蔬捷。
當(dāng) Sprite::draw() 被調(diào)用的時候垄提,它將會檢查 Sprite 是否超出屏幕,如果是的話周拐,它將不會發(fā)送 QuadCommand 命令給 渲染器,因此可以獲得一些性能上的提升铡俐。
全局 Z 值
Node 增加了新的函數(shù) setGlobalZOrder() / getGlobalZOrder(),之前的舊函數(shù) setZOrder() / getZOrder() 也被重命名為 setLocalZOrder() / getLocalZOrder()。
globalZOrder 是一個 float (不是 int)的參數(shù)妥粟。這個值在 渲染器 中用來給 RenderCommand 排序审丘。較低的值擁有較高的優(yōu)先級。這意味著一個 globalZorder 為 -10的節(jié)點(diǎn)會比一個 globalZOrder 為 10 的節(jié)點(diǎn)優(yōu)先繪制勾给。
globalZOrder 為 0 (默認(rèn)值)的節(jié)點(diǎn)將會根據(jù) Scene Graph 順序繪制滩报。
如果 globalZOrder 不變的話锅知,Cocos2d-x v3.0 和 Cocos2d-x v2.2 行為一致。
globalZOrder() 和 localZOrder():
globalZOrder 是用于 渲染器 中用來給“繪制命令”排序的
localZOrder 是用于父節(jié)點(diǎn)的子節(jié)點(diǎn)數(shù)組中給 節(jié)點(diǎn) 對象排序的
例外:
待辦事項(xiàng)
Sprite 和 SpriteBatchNode
v2.2 2.2版本中推薦的優(yōu)化游戲方式是將 SpriteBatchNode 對象設(shè)置為 Sprite 對象的父節(jié)點(diǎn)脓钾。 雖然使用 SpriteBatchNode 對象仍然是一個非常好的優(yōu)化游戲的方式售睹,但是它仍然有一定的限制:
Sprite 對象的孩子只能是 Sprite (否則,Cocos2d-x 會觸發(fā)斷言)
當(dāng) Sprite 的父節(jié)點(diǎn)是 SpriteBactchNode 時可训,不能添加 ParticleSystem 作為 Sprite的子節(jié)點(diǎn)昌妹。
這將導(dǎo)致當(dāng) Sprite 的父節(jié)點(diǎn)是 SpriteBatchNode 時,不能使用 ParallaxNode
所有的 Sprite 對象必須共享相同的紋理ID (否則沉噩,Cocos2d-x 會觸發(fā)斷言)
Sprite 對象使用 SpriteBatchNode 的混合函數(shù)和著色器捺宗。
雖然 v3.0 仍然支持 SpriteBatchNode (與之前的版本擁有相同的特效和限制),但是我們不鼓勵使用它川蒙。相反蚜厉,我們推薦直接使用 Sprite,不需要再它作為子節(jié)點(diǎn)添加到 SpriteBatchNode 中畜眨。
但是昼牛,為了能讓 v3.0 有更好的表現(xiàn),你必須要確保你的 Sprite 對象滿足以下條件:
貢獻(xiàn)相同的紋理ID(把它們放在一個spritesheet中康聂,就像使用 SpriteBatchNode 一樣)
確保它們使用相同的著色器和混合函數(shù)(就像使用 SpriteBatchNode 一樣)
如果這么做贰健, Sprites 將會像使用 SpriteBatchNode 一樣的快...(在舊設(shè)備上大概慢了10%,在新設(shè)備上基本上察覺不出)
v2.2 和 v3.0 最大的區(qū)別在于:
Sprite 對象可以有不同的紋理ID恬汁。
Sprite 對象可以有不同種類的 Node 作為子節(jié)點(diǎn)伶椿,包括 ParticleSystem。
Sprite 對象可以有不同的混合函數(shù)和不同的著色器氓侧。
但是如果你這么做脊另,渲染器 可能無法對它所有的子節(jié)點(diǎn)進(jìn)行批處理(性能較低)。但是游戲仍然可以正常運(yùn)行约巷,不會觸發(fā)任何斷言偎痛。
總結(jié):
保持將所有的精靈放在一張大的 spritesheet 中。
使用相同的混合函數(shù)(使用默認(rèn))
使用相同的著色器(使用默認(rèn))
不要將精靈添加到 SpriteBatchNode
只有當(dāng)你需要一些額外的性能上提升(雖然很卸览伞)踩麦,SpriteBatchNode 才會是你最后的選擇(你需要對它的限制條件很熟悉)。
優(yōu)化 LabelTTF / LabelBMFont / LabelAtlas
這些特性從 v3.0-alpha0 開始被添加
LabelTTF, LabelBMFont 和 LabelAtlas 將會被新的 Label 代替. 新的 Label 帶來的好處有:
統(tǒng)一了創(chuàng)建 LabelTTF, LabelBMFont 和 LabelAtlas 的 API
使用 freetype 生成 labels 的紋理氓癌,這樣就能保證在不同的平臺下 labels 有相同的效果谓谦。
緩存紋理以提高性能
新的事件分發(fā)機(jī)制
這些特性從 v3.0-alpha0 開始被添加
觸摸事件,鍵盤事件顽铸,加速器事件和自定義事件等所有事件都由 EventDispatcher 分發(fā)茁计。 TouchDispatcher, KeypadDispatcher, KeyboardDispatcher, AccelerometerDispatcher 已經(jīng)被移除。
EventDispatcher 的特性主要有:
事件的分發(fā)基于渲染順序
所有的事件都由 EventDispatcher 分發(fā)
可以使用 EventDispatcher 來分發(fā)自定義事件
可以注冊一個 lambda 表達(dá)式作為回調(diào)函數(shù)
更多 EventDispatcher 細(xì)節(jié)可以參考 這個文檔谓松。
物理引擎集成
這些特性從 v3.0-pre-alpha0 開始被添加
在 v3.0 中星压,我們把基于 Chipmunk2D 的物理引擎集成到 Cocos2d-x 中,通過這些特性鬼譬,你可以很容易創(chuàng)建基于物理效果的游戲娜膘,而不必去理解物理引擎。
更的關(guān)于物理引擎集成的細(xì)節(jié)可以參考 這個文檔优质。
其他 API 變更
ccTypes.h
在 ccType.h 中刪除結(jié)構(gòu)命名中的 cc 前綴竣贪,將全局函數(shù)移至靜態(tài)成員函數(shù),將全局常量移至靜態(tài)成員常量巩螃。
| v2.1 struct names | v3.0 struct names |
| ccColor3B | Color3B |
| ccColor4B | Color4B |
| ccColor4F | Color4F |
| ccVertex2F | Vertex2F |
| ccVertex3F | Vertex3F |
| ccTex2F | Tex2F |
| ccPointSprite | PointSprite |
| ccQuad2 | Quad2 |
| ccQuad3 | Quad3 |
| ccV2F_C4B_T2F | V2F_C4B_T2F |
| ccV2F_C4F_T2F | V2F_C4F_T2F |
| ccV3F_C4B_T2F | V3F_C4B_T2F |
| ccV2F_C4B_T2F_Triangle | V2F_C4B_T2F_Triangle |
| ccV2F_C4B_T2F_Quad | V2F_C4B_T2F_Quad |
| ccV3F_C4B_T2F_Quad | V3F_C4B_T2F_Quad |
| ccV2F_C4F_T2F_Quad | V2F_C4F_T2F_Quad |
| ccBlendFunc | BlendFunc |
| ccT2F_Quad | T2F_Quad |
| ccAnimationFrameData | AnimationFrameData |
全局函數(shù)變更示例
// in v2.1
ccColor3B color3B = ccc3(0, 0, 0);
ccc3BEqual(color3B, ccc3(1, 1, 1));
ccColor4B color4B = ccc4(0, 0, 0, 0);
ccColor4F color4F = ccc4f(0, 0, 0, 0);
color4F = ccc4FFromccc3B(color3B);
color4F = ccc4FFromccc4B(color4B);
ccc4FEqual(color4F, ccc4F(1, 1, 1, 1));
color4B = ccc4BFromccc4F(color4F);
color3B = ccWHITE;
// in v3.0
Color3B color3B = Color3B(0, 0, 0);
color3B.equals(Color3B(1, 1, 1));
Color4B color4B = Color4B(0, 0, 0, 0);
Color4F color4F = Color4F(0, 0, 0, 0);
color4F = Color4F(color3B);
color4F = Color4F(color4B);
color4F.equals(Color4F(1, 1, 1, 1));
color4B = Color4B(color4F);
color3B = Color3B::WHITE;
棄用的函數(shù)和全局變量
| v2.1 names | v3.0 names |
| ccp | Point |
| ccpNeg | Point::- |
| ccpAdd | Point::+ |
| ccpSub | Point::- |
| ccpMult | Point::* |
| ccpMidpoint | Point::getMidpoint |
| ccpDot | Point::dot |
| ccpCrosss | Point::cross |
| ccpPerp | Point::getPerp |
| ccpRPerp | Point::getRPerp |
| ccpProject | Point::project |
| ccpRotate | Point::rotate |
| ccpUnrotate | Point::unrotate |
| ccpLengthSQ | Point::getLengthSq() |
| ccpDistanceSQ | Point::getDistanceSq |
| ccpLength | Point::getLength |
| ccpDistance | Point::getDistance |
| ccpNormalize | Point::normalize |
| ccpForAngle | Point::forAngle |
| ccpToAngle | Point::getAngle |
| ccpClamp | Point::getClampPoint |
| ccpFromSize | Point::Point |
| ccpCompOp | Point::compOp |
| ccpLerp | Point::lerp |
| ccpFuzzyEqual | Point::fuzzyEqual |
| ccpCompMult | Point::Point |
| ccpAngleSigned | Point::getAngle |
| ccpAngle | Point::getAngle |
| ccpRotateByAngle | Point::rotateByAngle |
| ccpLineInersect | Point::isLineIntersect |
| ccpSegmentIntersect | Point::isSegmentIntersect |
| ccpIntersectPoint | Point::getIntersectPoint |
| CCPointMake | Point::Point |
| CCSizeMake | Size::Size |
| CCRectMake | Rect::Rect |
| PointZero | Point::ZERO |
| SizeZero | Size::ZERO |
| RectZero | Rect::ZERO |
| TiledGrid3DAction::tile | TiledGrid3DAction::getTile |
| TiledGrid3DAction::originalTile | TiledGrid3DAction::getOriginalTile |
| TiledGrid3D::tile | TiledGrid3D::getTile |
| TiledGrid3D::originalTile | TiledGrid3D::getOriginalTile |
| Grid3DAction::vertex | Grid3DAction::getVertex |
| Grid3DAction::originalVertex | Grid3DAction::getOriginalVertex |
| Grid3D::vertex | Grid3D::getVertex |
| Grid3D::originalVertex | Grid3D::getOriginalVertex |
| Configuration::sharedConfiguration | Configuration::getInstance |
| Configuration::purgeConfiguration | Configuration::destroyInstance() |
| Director::sharedDirector() | Director::getInstance() |
| FileUtils::sharedFileUtils | FileUtils::getInstance |
| FileUtils::purgeFileUtils | FileUtils::destroyInstance |
| GLView::sharedOpenGLView | GLView::getInstance |
| ShaderCache::sharedShaderCache | ShaderCache::getInstance |
| ShaderCache::purgeSharedShaderCache | ShaderCache::destroyInstance |
| AnimationCache::sharedAnimationCache | AnimationCache::getInstance |
| AnimationCache::purgeSharedAnimationCache | AnimationCache::destroyInstance |
| SpriteFrameCache::sharedSpriteFrameCache | SpriteFrameCache::getInstance |
| SpriteFrameCache:: purgeSharedSpriteFrameCache | SpriteFrameCache::destroyInstance |
| NotificationCenter::sharedNotificationCenter | NotificationCenter::getInstance |
| NotificationCenter:: purgeNotificationCenter | NotificationCenter::destroyInstance |
| Profiler::sharedProfiler | Profiler::getInstance |
| UserDefault::sharedUserDefault | UserDefault::getInstance |
| UserDefault::purgeSharedUserDefault | UserDefault::destroyInstance |
| Application::sharedApplication | Application::getInstance |
| ccc3() | Color3B() |
| ccc3BEqual() | Color3B::equals() |
| ccc4() | Color4B() |
| ccc4FFromccc3B() | Color4F() |
| ccc4f() | Color4F() |
| ccc4FFromccc4B() | Color4F() |
| ccc4BFromccc4F() | Color4B() |
| ccc4FEqual() | Color4F::equals() |
| ccWHITE | Color3B::WHITE |
| ccYELLOW | Color3B::YELLOW |
| ccBLUE | Color3B::BLUE |
| ccGREEN | Color3B::GREEN |
| ccRED | Color3B::RED |
| ccMAGENTA | Color3B::MAGENTA |
| ccBLACK | Color3B::BLACK |
| ccORANGE | Color3B::ORANGE |
| ccGRAY | Color3B::GRAY |
| kBlendFuncDisable | BlendFunc::BLEND_FUNC_DISABLE |
Lua 綁定的修改
使用 Lua 綁定生成工具
只需要為模塊寫個 ini 文件演怎,而不必寫一堆的 .pkg 文件。
綁定帶命名空間的類到 Lua
之前不能綁定具有相同類名避乏、不同命名空間的類到 Lua爷耀。為了解決這個問題,現(xiàn)在類的元表名已被修改了拍皮。比如歹叮,CCNode 將會被改為 cc.Node 。這樣的改變將會影響如下一些API的使用铆帽。
| v2.x | v3.0 |
| tolua_usertype(tolua_S,"CCNode") | tolua_usertype(tolua_S,"cc.Node") |
| tolua_isusertable(tolua_S,1,"CCNode",0,&tolua_err | tolua_isusertable(tolua_S,1,"cc.Node",0,&tolua_err |
| tolua_isusertype(tolua_S,1,"CCNode",0,&tolua_err) | tolua_isusertype(tolua_S,1,"cc.Node",0,&tolua_err) |
| toluafix_pushusertype_ccobject(tolua_S, nID, pLuaID, (void)tolua_ret,"CCNode") | toluafix_pushusertype_ccobject(tolua_S, nID, pLuaID, (void)tolua_ret,"cc.Node") |
| tolua_pushusertype(tolua_S,(void)tolua_ret,"CCFileUtils") | tolua_pushusertype(tolua_S,(void)tolua_ret,"cc.FileUtils") |
| tolua.cast(pChildren[i + 1], "CCNode") | tolua.cast(pChildren[i + 1], "cc.Node") |
使用 ScriptHandlerMgr 來管理注冊和注銷 Lua 函數(shù)
當(dāng)我們想要為類的 Lua 函數(shù)添加注冊和注銷功能咆耿,我們需要改變聲明和定義文件,然后綁定到 Lua爹橱。 在 v3.0 中萨螺,我們使用了 ScriptHandlerMgr。舉個例子愧驱,我們可以看下 MenuItem 這個類: 在 v2.x 中慰技,我們需要在 MenuItem 的頭文件中添加一個聲明:
virtual void registerScriptTapHandler(int nHandler);
virtual void unregisterScriptTapHandler(void);
然后在 .cpp 文件中實(shí)現(xiàn)它們,在 Lua 腳本中使用它們:
menuItem:registerScriptTapHandler(luafunction)
在 v3.0 中冯键,我們只需要在 ScriptHandlerMgr 中添加一個 HandlerType 的枚舉類型惹盼,然后在 luascript 中實(shí)現(xiàn)即可:
ScriptHandlerMgr:getInstance():registerScriptHandler(menuItem, luafunction,cc.HANDLERTYPE_MENU_CLICKED)
其它 API 變更
使用 cc、ccs惫确、ccui gl 和 sp 作為模塊名
現(xiàn)在類已經(jīng)被綁定到不同的模塊而不是使用全局模塊手报。這可以避免和其他代碼產(chǎn)生沖突。
cocos2d改化、cocos2d::extension掩蛤、CocosDenshion 和 cocosbuilder 的類被綁到 cc 模塊
cocos2d:ui 的類被綁到 ccui 模塊
spine 的類被綁到 sp 模塊
cocostudio 的類被綁到 ccs 模塊
全局變量被綁到相應(yīng)的模塊
所有關(guān)于 openGl 的函數(shù)和常量被綁到 gl 模塊
示例:
| v2.1 | v3.0 |
| CCDirector | cc.Director |
| CCArmature | ccs.Armature |
| kCCTextAlignmentLeft | cc.kCCTextAlignmentLeft |
函數(shù)名修改
一些全局函數(shù)被重命名:
示例:
| v2.1 | v3.0 |
| CCPoint/ccp | cc.p |
| CCRect | cc.rect |
| CCColor3B | cc.c3b |
| CCColor4B | cc.c4b |
| CCColor4F | cc.c4f |
添加一些模塊
在 v3.0 中,更多模塊被綁定到 Lua陈肛,具體如下:
physics
spine
XMLHttpRequest
OpenGL
XMLHttpRequest 和 physics 在 cc 模塊中揍鸟,spine 在 sp 模塊中, OpenGL 在 gl 模塊中句旱,相關(guān)的測試?yán)冢?/p>
physics ---> TestLua/PhysicsTest
spine ---> TestLua/SpineTest
XMLHttpRequest ---> TestLua/XMLHttpRequestTest
openGL ---> TestLua/OpenGLTest
增加更多的 Lua 綁定
比如:新的 Label阳藻、新的事件分發(fā)機(jī)制和 AssetsManager 等等晰奖。相關(guān)的測試?yán)冢?/p>
New Label ---> TestLua/LabelTestNew
New EventDispatcher --->TestLua/NewEventDispatcherTest
AssetsManager ---> TestLua/AssetsManagerTest
將一些 Lua 綁定的類或結(jié)構(gòu)體替換成表
在 v3.0中,所有 Lua 綁定的結(jié)構(gòu)體類型被替換成表
示例:
| v2.1 | v3.0 |
| CCPoint | lua table |
| CCRect | lua table |
| CCColor3B | lua table |
| CCColor4B | lua table |
| CCColor4F | lua table |
| CCAffineTransform | lua table |
| CCArray | lua table |
| CCDictionary | lua table |
| CCPointArray | lua table |
支持 Lua 腳本代碼調(diào)用 Object-C 代碼和 java 代碼
LuaObjcBridge 和 LuaJavaBridge 被綁定到 Lua 以支持 Lua 腳本代碼調(diào)用 Object-C 代碼和 java 代碼腥泥。
添加一些 Lua 文件來儲存不同的模塊常量
Cocos2DConstants.lua 儲存 cc 模塊的常量
StudioConstants.lua 儲存 ccs 模塊的常量
GuiConstants.lua 儲存 ccui 模塊的常量
OpenglConstants.lua 儲存 gl 模塊的常量