from://http://blog.linguofeng.com/pages/language/c/Cocos2dx.html

Cocos2d-x

开源、跨平台的游戏引擎


一、下载

http://cocos2d-x.org/projects/cocos2d-x/wiki/Download

二、安装 环境:Ubuntu 12.04.1 32bit

$ mkdir /path/to/cocos2d-x
$ mv cocos2d-2.0-rc2-x-2.0.1.zip /path/to/cocos2d-x
$ cd /path/to/cocos2d-x
$ unzip cocos2d-2.0-rc2-x-2.0.1.zip
$ subl ~/.bashrc
export COCOS2DX_ROOT=/path/to/cocos2d-x
export NDK_ROOT=/path/to/android-ndk-r8b // 需要Android Ndk环境

三、HelloWorld 需要有Android SDK环境与Ant,点击查看

$ cd $COCOS2DX_ROOT/HelloWorld/proj.android
$ chmod u+x build_native.sh
$ ./build_native.sh // 编译库
$ android update project -p . -t android-10 // 生成Ant需要的build.xml文件
$ ant debug install // 安装到机器上

四、Cocds2d-x基础

主要类介绍

说明作用关系
CCDirector导演(单例)负责场景的切换以及场景的信息。如宽度,高度,旋转场景内容。包含多个 CCScene
CCScene场景场景包含有布景,精灵,每场戏的不同,要切换场景。游戏中可分为主界面, 游戏, 分数榜,结束界面等。包含多个 CCLayer
CCLayer布景类似是层的概念,也可来源于PS的层的概念。每一层都带有众多精灵等包含多个 CCSprite
CCSprite精灵就是演员的,演员就需要加入到层里面去的。有相应的动作。包含多个 CCAction
CCAction动作精灵的动作。 
CCMenu菜单  

场景的转换

CCScene* scene =CCScene::node();// 创建sceneCCLayer* layer =CCLayer::node();// 创建layer
scene->addChild(layer);// 添加layer到sceneCCScene* preScene =CCDirector::ShareDirector()->getRunningScene();// 获取当前正在显示的场景if(preScene ==null){// 如果当前没有正在显示的场景CCDirecotr::ShareDirector()->runWithScene(scene);// 显示myScene场景}else{// 否则CCDirecotr::ShareDirector()->replaceScene(scene);// 替换成myScene场景}

常见宏

NS_CC_BEGIN
// cocos2d命名空间开始
NS_CC_END
// cocos2d命名空间结束
USING_NS_CC;// 声明cocos2d命名空间
CC_SYNTHESIZE_READONLY(varType, varName, funName)// 声明一个成员变量以及getfunName函数,没有set函数。getfunName已经实现,其实现就是返回这个值。
CC_SYNTHESIZE_READONLY_PASS_BY_REF(varType, varName, funName)// 类似CC_SYNTHESIZE_READONLY,不过getfunName返回的是引用。
CC_SYNTHESIZE(varType, varName, funName)// 声明一个成员变量以及getfunName,setfunName函数.函数声明和实现都有
CC_SYNTHESIZE_PASS_BY_REF(varType, varName, funName)// 类似CC_SYNTHESIZE,不过getfunName返回的是引用。
CC_PROPERTY_READONLY(varType, varName, funName)// 声明一个成员变量以及getfunName函数,没有set函数。getfunName函数的实现要自己做
CC_PROPERTY_READONLY_PASS_BY_REF(varType, varName, funName)// 类似CC_PROPERTY_READONLY,不过getfunName返回的是引用。getfunName函数的实现要自己做
CC_PROPERTY(varType, varName, funName)// 声明一个成员变量以及getfunName,setfunName函数.函数实现要自己做
CC_PROPERTY_PASS_BY_REF(varType, varName, funName)// 类似CC_PROPERTY,,不过getfunName返回的是引用

4.1 动作

CCAction :动作,分为瞬时动作 CCActionInstanse ,延时动作 CCActionInterval

动作说明构造 CCActionInterval参数说明
CCMoveTo移动到目标位置CCMoveTo::actionWithDuration(2, ccp(100, 100))时间,位置
CCMoveBy从目标位置移动CCMoveBy::actionWithDuration(2, ccp(100, 100))时间,位置
CCScaleTo缩放至多少倍CCScaleTo::actionWithDuration(2, 0.5f)时间,倍数(x、Y柚同时缩放)
CCScaleBy放大至多少倍CCScaleBy::actionWithDuration(2, 2f, 3f)时间,x柚放大倍数,Y柚放大倍数
CCRotateTo旋转多少角度CCRotateTo::actionWithDuration(2, 45f)时间,角度(正数顺时间,负数逆时针)
CCRotateBy旋转多少角度CCRotateBy::actionWithDuration(2, 360f)时间,角度(正数顺时间,负数逆时针)
CCSkewTo倾斜CCSkewTo::actionWithDuration(2, 37.2f, -37.2f)时间,X柚倾斜角度,Y柚倾斜角度
CCSkewBy倾斜CCSkewBy::actionWithDuration(2, 37.2f, -37.2f)时间,X柚倾斜角度,Y柚倾斜角度
CCJumpTo跳跃CCJumpTo::actionWithDuration(2, ccp(300,300), 50, 4)时间,目标坐标,跳的高度,跳的次数
CCJumpBy跳跃CCJumpBy::actionWithDuration(2, ccp(300,300), 50, 4)时间,目标坐标,跳的高度,跳的次数
CCBezierTo贝塞尔曲线运行CCBezierTo::actionWithDuration(3, bezier)时间,ccBezierConfig结构体
CCBezierBy贝塞尔曲线运行CCBezierBy::actionWithDuration(3, bezier)时间,ccBezierConfig结构体
CCBlinkCCBlink::actionWithDuration(2, 10)时间,次数
CCFadeIn淡入CCFadeIn::actionWithDuration(1.0f)时间
CCFadeOut淡出CCFadeOut::actionWithDuration(1.0f)时间
CCTintTo颜色变化CCTintTo::actionWithDuration(2, 255, 0, 255)时间,红,绿,蓝
CCTintBy颜色变化CCTintBy::actionWithDuration(2, 255, 0, 255)时间,红,绿,蓝
CCAnimate动画CCAnimate::actionWithDuration(3, animation, false)时间,CCAnimation,是否恢复原始帧
动作组合方式说明构造 CCAction参数
CCSequence动作序列,有序地一个一个执行动作CCSequence::actions(actionTo, actionToBack, NULL)动作1、运作2、…、后面必须加NULL表示没有了
CCRepeatForever重复执行动作CCRepeatForever::actionWithAction(actionTo)动作
CCSpawn同时执行动作CCSpawn::actions(actionTo, actionToBack, NULL)动作1、运作2、…、后面必须加NULL表示没有了
动作回调说明构造参数
CCCallFunc不带参数的回调CCCallFunc::actionWithTarget(this, callfunc_selector(Class::callback1))当前动作,回调函数
CCCallFuncN不带参数但带调用本身CCCallFuncN::actionWithTarget(this, callfuncN_selector(Class::callback2))当前动作,回调函数
CCCallFuncND带参数的回调CCCallFuncND::actionWithTarget(this, callfuncND_selector(Class::callback3), (void*)0xbebabeba)当前动作,回调函数
CCSize size =CCDirector::sharedDirector()->getWinSize();// 获取屏幕大小CCSprite* pSprite =CCSprite::spriteWithFile("HelloWorld.png");// 创建精灵CCActionInterval* actionTo =CCMoveTo::actionWithDuration(2,CCPointMake(size.width-40, size.height-40));
pSprite->runAction(actionTo);// 运行动作

4.2 菜单

CCMenu :菜单,参考: http://www.cocos2d-x.org/reference/native-cpp/d1/da0/classcocos2d_1_1_c_c_menu.html

// 创建菜单ItemCCMenuItem* m1 =CCMenuItemFont::itemFromString("新游戏",this, menu_selector(MainLayer::onNewGame));// menu_selector为全局常量CCLabelBMFont* label =CCLabelBMFont::labelWithString("Enable AtlasItem","fonts/bitmapFontTest3.fnt");CCMenuItem* m2 =CCMenuItemLabel::itemWithLabel(label,this, menu_selector(MainLayer::onNewGame));// 通过Label创建ItemCCMenuItem* m3 =CCMenuItemAtlasFont// 通过CCSprite*spriteNormal   =CCSprite::spriteWithFile("image.png",CCRectMake(0,23*2,115,23));CCSprite*spriteSelected =CCSprite::spriteWithFile("image.png",CCRectMake(0,23*1,115,23));CCSprite*spriteDisabled =CCSprite::spriteWithFile("image.png",CCRectMake(0,23*0,115,23));CCMenuItem* m4 =CCMenuItemSprite::itemFromNormalSprite(spriteNormal, spriteSelected, spriteDisabled,this,
menu_selector(MainLayer::onNewGame));CCMenuItem* m5 =CCMenuItemImage::itemFromNormalImage("image.png","imagep.png",this, menu_selector(MainLayer::onNewGame));CCMenuItem* m6 =CCMenuItemToggle::itemWithTarget(this, menu_selector(MainLayer::onNewGame),CCMenuItemFont::itemFromString("High"),CCMenuItemFont::itemFromString("Low"),...,
NULL);
m6->getSubItems()->addObject(CCMenuItemFont::itemFromString("33%"));
m6->setSelectedIndex(2);// 添加菜单Item到菜单中CCMenu* menu =CCMenu::menuWithItems(m1, m2, m3, m4, m5, m6, NULL);// 最后必须加NULLvoidMainLayer::onNewGame(CCObject* pSender){// 回调}

4.3 多层

CCLayerMultiplex :多个层,参考: http://www.cocos2d-x.org/reference/native-cpp/d3/d7e/classcocos2d_1_1_c_c_layer_multiplex.html

CCLayer* pLayer1 =newMenuLayer1();CCLayer* pLayer2 =newMenuLayer2();CCLayer* pLayer3 =newMenuLayer3();CCLayer* pLayer4 =newMenuLayer4();CCLayerMultiplex* layer =CCLayerMultiplex::layerWithLayers(pLayer1, pLayer2, pLayer3, pLayer4, NULL);
addChild(layer,0); pLayer1->release();
pLayer2->release();
pLayer3->release();
pLayer4->release();CCDirector::sharedDirector()->replaceScene(this);// 切换((CCLayerMultiplex*)m_pParent)->switchTo(0);

4.4 进度条

CCProgressTimer :进度条

type说明
kCCProgressTimerTypeRadialCCW径向逆时针旋转
kCCProgressTimerTypeRadialCW径向顺时针旋转
kCCProgressTimerTypeHorizontalBarLR水平从左往右
kCCProgressTimerTypeHorizontalBarRL水平从右往左
kCCProgressTimerTypeVerticalBarBT垂直从下往上
kCCProgressTimerTypeVerticalBarTB垂直从上往下
CCProgressTimer* pt =CCProgressTimer::progressWithFile("image.png");
pt->setType(kCCProgressTimerTypeRadialCCW);
pt->setType(kCCProgressTimerTypeRadialCW);
pt->setType(kCCProgressTimerTypeHorizontalBarLR);
pt->setType(kCCProgressTimerTypeHorizontalBarRL);
pt->setType(kCCProgressTimerTypeVerticalBarBT);
pt->setType(kCCProgressTimerTypeVerticalBarTB);CCProgressTo* to =CCProgressTo::actionWithDuration(2,100);// 时间,百分比
pt->runAction(CCRepeatForever::actionWithAction(to));

4.5 场景转换

CCTransitionScene :场景转换效果

效果说明方法参数
CCTransitionFade以颜色淡出淡入transitionWithDuration(时间, 场景, ccBLACK)ccc3(255,0,0) :三原色
CCTransitionFlipX水平翻转屏幕transitionWithDuration(时间, 场景, kOrientationRightOver)kOrientationLeftOver:从左往右 
kOrientationRightOver:从右往左
CCTransitionFlipY垂直翻转屏幕transitionWithDuration(时间, 场景, kOrientationUpOver)kOrientationUpOver :从上往下 
kOrientationDownOver:从下往上
CCTransitionFlipAngular角度翻转屏幕transitionWithDuration(时间, 场景, kOrientationRightOver)kOrientationLeftOver:从左下角往上 
kOrientationRightOver:从右上角往下
CCTransitionZoomFlipX水平翻转并缩小/放大transitionWithDuration(时间, 场景, kOrientationRightOver)kOrientationLeftOver:从左(放大)往右 
kOrientationRightOver:从右(放大)往左
CCTransitionZoomFlipY垂直翻转并缩小/放大transitionWithDuration(时间, 场景, kOrientationUpOver)kOrientationUpOver :从上(放大)往下 
kOrientationDownOver:从下(放大)往上
CCTransitionZoomFlipAngular角度翻转并缩小/放大transitionWithDuration(时间, 场景, kOrientationRightOver)kOrientationLeftOver:从左下角(放大)往上 
kOrientationRightOver:从右上角(放大)往下
CCTransitionShrinkGrow收缩出放大入transitionWithDuration(时间, 场景) 
CCTransitionRotoZoom转收缩出转放大入transitionWithDuration(时间, 场景) 
CCTransitionMoveInL从左移动入transitionWithDuration(时间, 场景) 
CCTransitionMoveInR从右移动入transitionWithDuration(时间, 场景) 
CCTransitionMoveInT从上移动入transitionWithDuration(时间, 场景) 
CCTransitionMoveInB从下移动入transitionWithDuration(时间, 场景) 
CCTransitionSlideInL从左平滑移入transitionWithDuration(时间, 场景) 
CCTransitionSlideInR从右平滑移入transitionWithDuration(时间, 场景) 
CCTransitionSlideInT从上平滑移入transitionWithDuration(时间, 场景) 
CCTransitionSlideInB从下平滑移入transitionWithDuration(时间, 场景) 
CCTransitionCrossFade交叉淡入两个场景transitionWithDuration(时间, 场景) 
CCTransitionPageTurn翻页transitionWithDuration(时间, 场景, 参数)true :合上 
false :翻开
CCTransitionFadeTR往右上角马赛克退出transitionWithDuration(时间, 场景) 
CCTransitionFadeBL往左下角马赛克退出transitionWithDuration(时间, 场景) 
CCTransitionFadeUp往上角马赛克退出transitionWithDuration(时间, 场景) 
CCTransitionFadeDown往下角马赛克退出transitionWithDuration(时间, 场景) 
CCTransitionTurnOffTiles随机马赛克退出transitionWithDuration(时间, 场景) 
CCTransitionSplitRows基数行左,偶数行右退出transitionWithDuration(时间, 场景) 
CCTransitionSplitCols基数行上,偶数行下退出transitionWithDuration(时间, 场景) 
CCTransitionFade* tfScene =CCTransitionFade::transitionWithDuration(2,newCCScene(), ccBLACK);if(tfScene){CCDirector::sharedDirector()->replaceScene(pScene);}

4.6 效果

说明静态函数
CCShaky3D摇动的3DCCShaky3D::actionWithRange(5, true, ccg(15,10), t) // 范围 是否摇动 网格大小 时间
CCWaves3D波浪3DCCWaves3D::actionWithWaves(5, 40, ccg(15,10), t)
CCFlipX3D水平翻转3DCCFlipX3D::actionWithDuration(t)
CCFlipY3D垂直翻转3DCCFlipY3D::actionWithDuration(t)
CCLens3D镜面3DCCLens3D::actionWithPosition(CCPointMake(size.width/2,size.height/2), 240, ccg(15,10), t)
CCRipple3D波纹3DCCRipple3D::actionWithPosition(CCPointMake(size.width/2,size.height/2), 240, 4, 160, ccg(32,24), t)
CCLiquid液体效果CCLiquid::actionWithWaves(4, 20, ccg(16,12), t)
CCWaves波浪效果CCWaves::actionWithWaves(4, 20, true, true, ccg(16,12), t)
CCTwirl晃动效果CCTwirl::actionWithPosition(CCPointMake(size.width/2, size.height/2), 1, 2.5f, ccg(12,8), t)
CCShakyTiles3D摇动马赛克CCShakyTiles3D::actionWithRange(5, true, ccg(16,12), t)
CCShatteredTiles3D破碎马赛克CCShatteredTiles3D::actionWithRange(5, true, ccg(16,12), t)
CCShuffleTiles随机马赛克CCShuffleTiles::actionWithSeed(25, ccg(16,12), t)
CCFadeOutTRTiles往右上角马赛克淡出CCFadeOutTRTiles::actionWithSize(ccg(16,12), t)
CCFadeOutBLTiles往左下角马赛克淡出CCFadeOutBLTiles::actionWithSize(ccg(16,12), t)
CCFadeOutUpTiles往上马赛克淡出CCFadeOutUpTiles::actionWithSize(ccg(16,12), t)
CCFadeOutDownTiles往下马赛克淡出CCFadeOutDownTiles::actionWithSize(ccg(16,12), t)
CCTurnOffTiles马赛克随机消失CCTurnOffTiles::actionWithSeed(25, ccg(48,32) , t)
CCWavesTiles3D波浪马赛克CCWavesTiles3D::actionWithWaves(4, 120, ccg(15,10), t)
CCJumpTiles3D跳动的3D马赛克CCJumpTiles3D::actionWithJumps(2, 30, ccg(15,10), t)
CCSplitRows基数往左,偶数往下CCSplitRows::actionWithRows(9, t)
CCSplitCols基数往上,偶数往下CCSplitCols::actionWithCols(9, t)
CCPageTurn3D3D翻页效果CCPageTurn3D::actionWithSize(ccg(15,10), t)

4.7 节点

节点嵌套节点

CCSprite* pSprite1 =newCCSprite();// 一个精灵相当于一个节点CCSprite* pSprite2 =newCCSprite();

pSprite1->addChild(pSprite2);// 一个节点嵌套另一个节点

pSprite1->runAction(action);// 如果父节点执行动作,那此时所有子节点都会执行该动作。

节点删除与清除

prettyprint(node, false/true);          // 节点,false不清理正在运行的动作、true清理正在运行的动作

4.8 精灵

说明静态函数参数
CCSprite精灵CCSprite::spriteWithTexture(CCTexture2D*)质地
CCSprite::spriteWithTexture(CCTexture2D*, CCRect&)质地, CCRect 矩形
CCSprite::spriteWithTexture(CCTexture2D*, CCRect&, CCPoint&)质地,矩形,CCPoint 点
CCSprite::spriteWithSpriteFrame(CCSpriteFrame*)CCSpriteFrame 精灵框架
CCSprite::spriteWithSpriteFrameName(char*)CCSpriteFrame名称
CCSprite::spriteWithFile(char*)文件名
CCSprite::spriteWithFile(char*, CCRect&)文件名,矩形
CCSprite::spriteWithBatchNode(CCSpriteBatchNode*, CCRect&)CCSpriteBatchNode批量节点,矩形
CCSpriteBatchNode精灵批量节点CCSpriteBatchNode->addChild(CCSprite)添加多个精灵到节点上

4.9 定时器

schedule(schedule_selector(Class::callback),1);// 回调,时间;每隔1秒执行一次voidClass::callback(ccTime dt){}

unschedule(schedule_selector(Class::callback));// 取消定时器

4.10 内存管理 原则:每个自定义类必须继承 cocos2d::CCObject 对象

CCObject对象的内存管理相关接口

// 引用次数+1 virtualvoidCCObject::retain(void);// 引用次数-1;若引用计数器=0,则delete this; virtualvoidCCObject::release(void);// helper方法,快速判断当前对象只有唯一引用 boolCCObject::isSingleRefrence(void);// 返回引用次数 unsignedintCCObject::retainCount(void);// 自动释放(自动管理)CCObject*CCObject::autorelease(void);

手动管理内存

classMyClass:public cocos2d::CCObject{public:MyClass();~MyClass();}MyClass* obj =newMyClass();...
obj->release();// 谁生成(new、copy)谁负责release// 谁retain,谁负责release。
obj->retain();...
obj->release();// 传递赋值时,需要先retain形参,后release原指针,最后赋值。(注意,因为这里没有使用自赋值检查,所以这组顺序不能错。)voidCCNode::setGrid(CCGridBase* pGrid){
CC_SAFE_RETAIN(pGrid);
CC_SAFE_RELEASE(m_pGrid);
m_pGrid = pGrid;}

自动管理内存

MyClass* obj =newMyClass();
obj->autorelease();// 每帧绘制结束,就自动release池中的对象。
05-08 08:15