学习笔记 cocos2d-x 2.x到3.x的改动与区别

本文详细介绍了Cocos2d-x从2.x版本迁移到3.x版本的过程,包括核心API的变化、类名更新、触摸事件处理、单例类使用等方面的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近一直在做一个项目从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));


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值