现在的位置: 首页 > 综合 > 正文

【cocos2d-x官方文档】 从v1.x到2.x的API更改

2013年12月07日 ⁄ 综合 ⁄ 共 5713字 ⁄ 字号 评论关闭

本文由 sharyu 翻译,转载请注明原出处!!

从v1.x到2.x的API变化
1. 新的API概念
1.1 静态构造函数
1.2 单例
1.3 事件回调
2. 数据结构:CCDictionary和CCArray
2.1 为什么CCMutableDictionary被移除了?
2.2 CCDictionary的主键类型
2.3 如何使用CCDictionary?
2.4 为什么CCMutableArray被移除了?
3. 用Classname::isStatus的方式来返回bool值
4. 类
Director类
CCActionManager,CCTouchDispatcher,CCScheduler类
Sprite类
SpriteBatchNode类
CCGeometry,CCPoint,CCSize,CCRect类
CCTouch类
Transitions类
Particle System类
Menu类
Animate类
MotionStreak类
Layer类
Animation类
ProgressTimer类
CCNode类
RenderTexture类
CCFileUtils类
CCString类

1.新的API概念
根据 Cocos2d Javascript API,我们将大多数API的更改适用到了C++。下面罗列了这些更改的基本概念。
1.1 静态构造函数
[v2.0] 用Classname::create替代Classname::ClassnameWithResource。请参考About Static Constructor API changes in cocos2d-x v2.0。Lua API集合和Javascript API集合也使用了这种清晰的结构。
[v2.0] 使用createWithResource来避免冲突
[v2.0] 从::create()方法返回的CCObject*对象总是自动释放(auto-release)的。
1.2 单例
[v2.0.1] 所有单例都包含一个静态构造方法Singleton::getInstance(),和一个析构方法Singleton::destroyInstance(),替换了原来的@Classname::sharedClassname。这个变化同样适用于lua和javascript绑定。
1.3 事件回调
[v2.0.1] 事件回调, 例如:CCTouchDelegate::ccTouchesBegan/Moved/Ended/Cancelled(), 被重命名为CCSomethingDelegate::onSomethingDone(),包括:
Standard touch delegate: onTouchesBegan/Moved/Ended/Cancelled
Targeted touch delegate: onTouchBegan/Moved/Ended/Cancelled
Keypad delegate: onKeyBackClicked, onKeyMenuClicked
G-Sensor delegate: onAccelerometerChanged
2.数据结构:CCDictionary和CCArray
2.1 为什么CCMutableDictionary被取消了? 

在gles20分支里, ‘CCMutableDictionary’ and ‘CCMutableArray’被取消了。你需要用 CCDictionary and CCArray来替换它们。
CCDictionary是用UTHash来实现的。 CCMutableDictionary是用stl实现的, 相比较而言 CCDictionary的效率会至少提高两倍。并且, CCDictionary没有使用cpp的模版,因此可以方便地绑定到脚本。
2.2 CCDictionary中主键支持的类型
目前, CCDictionary的主键支持两种类型: ‘std::stirng’和’int’。一个 CCDictionary实例只支持一种主键类型。
在你第一次调用 ‘setObject’的时候,主键类型会被确认下来。
2.3 如何使用CCDictionary?
CCDictionary和 CCMutableDictionary的用法基本相同。我们保留了相同的API,移除了遍历字典时用到的 ‘begin’,’end’和’next’方法。取而代之,我们使用了 CCDICT_FOREACH宏。使用 CCDICT_FOREACH的方法和 CCARRAY_FOREACH的用法极为相似。
下面的代码阐述了如何遍历 CCDictionary:

  1. CCMutableDictionary    CCDictionary
  2. std::vector keys = theDict->allKeys();  CCDictElement* pElement = NULL;
  3. std::vector::iterator it;       CCDICT_FOREACH(theDict, pElement)
  4. for (it = keys.begin(); it != keys.end(); it++)
  5. {
  6. CCObjectSubClass* pSubClassObj = (CCObjectSubClass*)pElement->getObject();
  7. std::string oneKey = *it;    // You can also get the current key, but make sure you know the key type.
  8. CCObjectSubClass* pSubClassObj = theDict->objectForKey(oneKey);   std::string oneStrKey = pElement->getStrKey(); // if the key type is string.
  9. // do some operation by using pSubClass pointer.      
  10. // int oneIntKey = pElement->getIntKey(); // if the key type is integer.
  11. // do some operation by using pSubClass pointer.
  12. }

我们保留了 CCDictionary::allKeys方法,这样就可以按照与 CCMutableDictionary同样的方法遍历字典,但是我们强烈不建议这么做。因为 CCDICT_FOREACH的性能比获取所有主键然后使用 CCARRAY_FOREACH来遍历高的多。
如果你希望在lua中遍历 CCDictionary,当然,你无法使用 CCDICT_FOREACH宏,在这种情况下,你只能使用旧的方法。
2.4 为什么CCMutableArray被取消了?
在cocos2d-x 1.0.1中,我们有 CCArray和 CCMutableArray,让用户十分困惑,同时, CCMutableArray使用了模版和stl,坏处和 CCMutableDictionary一样。旧的CCArray不支持反向遍历数组,现在我们提供了 CCARRAY_FOREACH_REVERSE宏来实现此功能。
3.使用Classname::isStatus方式来返回一个bool类型
对于bool类型:
getter方法从getIsBool()或者getBool()统一为isBool()。
setter方法从setIsBool(value)统一为setBool(value)。
所有使用频繁的方法都被加粗标记了。

function name before   function name in v2.x  
CCCamera::getDirty CCCamera::isDirty
CCConfiguration::isSupportsNPOT CCConfiguration::supportsNPOT
CCConfiguration::isSupportsPVRTC CCConfiguration::supportsPVRTC
CCConfiguration::isSupportsBGRA8888 CCConfiguration::supportsBGRA8888
CCConfiguration::isSupportsDiscardFramebuffer CCConfiguration::supportsDiscardFramebuffer
CCConfiguration::isSupportsShareableVAO CCConfiguration::supportsShareableAVO
CCNode::getIsVisible CCNode::isVisible
CCNode::setIsVisible CCNode::setVisible
CCNode::getIsRunning CCNode::isRunning
CCGridBase::setIsTextureFlipped CCGridBase::setTextureFlipped
CCRGBAProtocol::getIsOpacityModifyRGB CCRGBAProtocol::isOpacityModifyRGB
CCRGBAProtocol::setIsOpacityModifyRGB CCRGBAProtocol::setOpacityModifyRGB
CCLayer::getIsTouchEnabled CCLayer::isTouchEnabled
CCLayer::setIsTouchEnabled CCLayer::setTouchEnabled
CCMenu::getIsEnabled CCMenu::isEnabled
CCMenu::setIsEnabled CCMenu::setEnabled
CCParticleSystem::getIsActive CCParticle::isActive
CCParticleSystem::getIsAutoRemovedOnFinish CCParticle::isAutoRemovedOnFinish
CCParticleSystem::setIsAutoRemovedOnFinish CCParticle::setAutoRemovedOnFinish
CCParticleSystem::getIsBlendActive CCParticleSystem::isBlendActive
CCParticleSystem::setIsBlendActive CCParticleSystem::setBlendActive
CCTexture2D::getIsHasPremultipliedAlpha CCTexture2D::hasPremultipliedAlpha
CCFileUtils::setIsPopupNotify CCFileUtils::isPopupNotify
CCFileUtils::setIsPopupNotify CCFileUtils::setPopupNotify
CCScriptSupport::getIsMultiTouches CCScriptSupport::isMultiTouches
CCScriptSupport::setIsVisible CCScriptSupport::setVisible

4.类
Director类

[v2.0-sync] CCDirector::setDisplayFPS(bool) -> setDisplayStats(bool)。现在左下的状态显示3个数字:
最上面的数字显示每帧调用了多少次OpenGL的draw方法。
中间的数字表示每帧耗费多少秒(SPF)。
最下面的数字是我们都很熟悉的FPS。
[v2.0-sync] CCDirector::isRetinaDisplay()被移除了。
[v2.0] *在Resources/下添加fps_images.png,并且添加到工程设置中。现在CCDirector使用CCLabelAtlas来显示FPS,这样做可以提高在android上的运行效率。
CCActionManager, CCTouchDispatcher, CCScheduler类
[v2.0-sync] CCActionManager, CCTouchDispatcher, CCScheduler现在是CCDirector的成员变量。但包含’cache’的单例类,比如CCTextureCache, CCAnimationCache, CCShaderCache还维持原状。
Sprite类
[v2.0-sync] CCSprite::displayedFrame() -> displayFrame()
SpriteBatchNode类
[v2.0-sync] CCSprite::spriteWithBatchNode(…)被移除,请使用: sprite = CCSprite::spriteWithTexture(batchNode->getTexture(), CCRect*); batchNode->addChild(sprite);代替。
[v2.0-sync] CCSprite::initWithBatchNode(…), initWithBatchNodeInPixels(…) 被移除,请使用CCSprite::setBatchNode(…)代替。
[v2.0-sync] bool CCSprite::isUsesBatchNode()被移除,请使用CCSpriteBatchNode* getSpriteBatchNode(),要判断返回值是否为NULL。
使用batch node创建sprite的示例代码:

  1. // create batch node from image file
  2. CCSpriteBatchNode* batch = CCSpriteBatchNode::create("BatchNodeTexture.png");
  3. // get the texture in batch node
  4. CCTexture2D* texture = batch->getTexture();

抱歉!评论已关闭.