學習筆記 cocos2d-x 2.x到3.x的改動與區別

最近一直在做一個項目從2.2.6移植到3.11,但是cocos2d-x 2.x和3.x差別比較大,因此網上參考了許多前輩的帖子和博客總結了一下,留着以後備用。


區別1.去CC
之前2.0的CC**,把CC都去掉,基本的元素都是保留的
2.0
CCSprite  CCCallFunc CCNode ..
3.0
Sprite CallFunc Node ..

   區別2.cc***結構體改變
2.0        
ccp(x,y)        
ccpAdd(p1,p2)
ccpSub
ccpMult
ccpLength(p)
ccpDot(p1,p2);
ccc3()
ccc4()
ccWHITE
CCPointZero
CCSizeZero
3.0
Point(x,y)
p1+p2;
p1-p2
p1*p2
p.getLength()
p1.dot(p2)
Color3B()
Color4B()
Color3B::WHITE
Point::ZERO
Size:ZERO

   區別3.shared***改變(單例機制使用語法)
2.0
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
SpriteFrameCache::sharedSpriteFrameCache()
AnimationCache::sharedAnimationCache()
NotificationCenter::sharedNotificationCenter()
…
3.0
Size size = Director::getInstance()->getWinSize();
SpriteFrameCache::getInstance()
AnimationCache::getInstance()
NotificationCenter::getInstance()

   區別4.POD類別
2.0
CCPoint 
CCSize
CCRect

3.0
Vec2
Size
Rect

   區別5.點觸事件
auto dispatcher = Director::getInstance()->getEventDispatcher();
auto touchListener = EventListenerTouchOneByOne::create();
touchListener->onTouchBegan = CC_CALLBACK_2(FBMainScene::onTouchBegan,this);
touchListener->onTouchMoved = CC_CALLBACK_2(FBMainScene::onTouchMoved,this);
touchListener->onTouchEnded = CC_CALLBACK_2(FBMainScene::onTouchEnded, this);
dispatcher->addEventListenerWithSceneGraphPriority(touchListener, this);
bool FBMainScene::onTouchBegan(Touch *touch,Event *pEvent){
  CCLOG("onTouchBegan");
  Point point = this->convertToWorldSpace(this->convertTouchToNodeSpace(touch));
  return true;
}
void FBMainScene::onTouchMoved(Touch *touch,Event *pEvent){
  CCLOG("onTouchMoved");
}
void FBMainScene::onTouchEnded(Touch *touch,Event *pEvent){
  CCLOG("onTouchEnded");
}
//獲得觸點的方法也發生了改變:
Point point = this->convertToWorldSpace(this->convertTouchToNodeSpace(touch));
//dispatcher控制方法:
dispatcher->addEventListener…
dispatcher->removeEventListener(listener);
dispatcher->removeAllListeners();

   區別6.CallFunc使用(使用"Function"對象)
CallFunc::create([&](){
        Sprite *sprite = Sprite::create("s");
        this->addChild(sprite);
});

   區別7.使用clone代替copy
2.0
CCMoveBy *action = (CCMoveBy*) move->copy();
action->autorelease();
3.0
action = move->clone();
不需要autorelease,在clone已經實現。

   區別8.Physics Integration 物理引擎
暫無使用,box2d 在 3.0中可以延續使用
在3.0的Physics中需要定義 PhysicsWorld, PhysicsBody, PhysicsShape, PhysicsJoint 等,於box2d相仿,使用前需要定義CC_USE_PHYSICS

   區別9.容器
2.0
CCArray

3.0
cocos2d::Vector<T>
cocos2d::Map<K,V>
cocos2d::Value


cocos2dx2.x&3.x部分函數對照表


| 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 |  
| EGLView::sharedOpenGLView | EGLView::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 |


cocos2d-x 常用類名改變

下面的表格中的類名的轉換方式主要是直接刪除了 CC 前綴。

# v2 v3
1 CCAction Action
2 CCPoint Point
3 CCAnimation Animation
4 CCSprite Sprite
5 CCLabel Label
6 CCMenu Menu
7 CCObject Ref
8 CCNode Node
9 CCScene Scene
10 CCLayer Layer
11 CCSpriteBatchNoe SpriteBatchNode
12 CCTMXTiledMap TMXTiledMap

cocos2d-x 類名改變

下面表格中的類名的轉換就比較大了。

# v2 v3
1 CCDictionary ValueMap
2 CCArray ValueVector
3 CCString Value

CCString 用法改變

之前:

CCString* str = CCString::createWithFormat("%s.png","picture");

現在:

std::string str = StringUtils::format("%s.png","picture");

CCDictinoary 用法改變

之前:

CCDictionary* dict = CCDictionary::createWithContentsOfFile("name.plist");
CCArray* arr = (CCArray*) data->objectForKey("Levels");

現在:

std::string path = FileUtils::getInstance()->fullPathForFilename("name.plist");
ValueMap dict = FileUtils::getInstance()->getValueMapFromFile(path);
ValueVector arrLevels = data.at("Levels").asValueVector();

CCArray 用法改變

這裏就是 C++ vector 容器的標準用法了。

# v2 v3
1 CCArray* sprites; Vector sprites;
2 sprites->addObject(sprite); sprites.pushBack(sprite);
3 sprites->removeObject(sprite); sprites.eraseObject(sprite);
4 sprites->removeObjectAtIndex(i); sprites.erase(i);
5 sprites->objectAtIndex(i); sprites.at(i);
6 sprites->count(); sprites.size();



觸摸用法改變

# v2 v3
1 ccTouchBegan onTouchBegan
2 ccTouchMoved onTouchMoved
3 ccTouchEnded onTouchEnded

單例類用法改變

# v2 v3
1 CCEGLView::sharedOpenGLView(); Director::getInstance()->getOpenGLView();
2 CCTextureCache::sharedTextureCache(); Director::getInstance()->getTextureCache();
3 CCNotificationCenter::sharedNotificationCenter(); Director::getInstance()->getEventDispatcher();

CCTime 用法改變

CCTime cocos2d-x v3 中已經被刪除了。

# v2 v3
1 cc_timeval timeval
2 CCTime::gettimeofdayCocos2d gettimeofday
3 CCTime::timesubCocos2d getTimeDiffenceMS

範例:

static inline float getTimeDifferenceMS(timeval& start, timeval& end)
{
    return ((((end.tv_sec - start.tv_sec)*1000.0f + end.tv_usec) - start.tv_usec) / 1000.0f);
}



OpenGL 的用法變化

# v2 v3
1 CCGLProgram GLProgram
3 kCCUniformPMatrix_s GLProgram::UNIFORM_NAME_P_MATRIX
4 kCCUniformMVMatrix_s GLProgram::UNIFORM_NAME_MV_MATRIX
5 kCCUniformMVPMatrix_s GLProgram::UNIFORM_NAME_MVP_MATRIX
6 kCCUniformTime_s GLProgram::UNIFORM_NAME_TIME
7 kCCUniformSinTime_s GLProgram::UNIFORM_NAME_SIN_TIME
8 kCCUniformCosTime_s GLProgram::UNIFORM_NAME_COS_TIME
9 kCCUniformRandom01_s GLProgram::UNIFORM_NAME_RANDOM01
10 kCCUniformSampler_s GLProgram::UNIFORM_NAME_SAMPLER0
11 kCCUniformAlphaTestValue GLProgram::UNIFORM_NAME_ALPHA_TEST_VALUE
12 kCCAttributeNameColor GLProgram::ATTRIBUTE_NAME_COLOR
13 kCCAttributeNamePosition GLProgram::ATTRIBUTE_NAME_POSITION
14 kCCAttributeNameTexCoord GLProgram::ATTRIBUTE_NAME_TEX_COORD

MenuItem 的用法變化

在 cocos2d-x v3 中,使用的是 C++11 提供的標準的 std::bind 功能來實現回調。

讓我們看看 base/ccMacros.h 中的幾個宏:

// new callbacks based on C++11
#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)
#define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)

所以,對於 cocos2d-x v2 中這樣的調用:

CMenuItemImage *item1 = CCMenuItemImage::create(s_pPathB1, s_pPathB2, this, menu_selector(ActionsDemo::backCallback));

在 cocos2d-x v3 中應該是這樣的:

MenuItemImage *item1 = MenuItemImage::create(s_pPathB1, s_pPathB2, CC_CALLBACK_1(ActionsDemo::backCallback, this));


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章