最近一直在做一個項目從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));