http://cocos2d-x.org/projects/cocos2d-x/wiki/Download
$ 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环境
$ 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 // 安装到机器上
*主要类介绍*
table(table table-bordered). |_.类|_.说明|_.作用|_.关系| |@CCDirector@|导演(单例)|负责场景的切换以及场景的信息。如宽度,高度,旋转场景内容。|包含多个 CCScene| |@CCScene@|场景|场景包含有布景,精灵,每场戏的不同,要切换场景。游戏中可分为主界面, 游戏, 分数榜,结束界面等。|包含多个 CCLayer| |@CCLayer@|布景|类似是层的概念,也可来源于PS的层的概念。每一层都带有众多精灵等|包含多个 CCSprite| |@CCSprite@|精灵|就是演员的,演员就需要加入到层里面去的。有相应的动作。|包含多个 CCAction| |@CCAction@|动作|精灵的动作。|| |@CCMenu@|菜单|||*场景的转换*
CCScene* scene = CCScene::node(); // 创建scene
CCLayer* layer = CCLayer::node(); // 创建layer
scene->addChild(layer); // 添加layer到scene
CCScene* 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返回的是引用
@CCAction@ :动作,分为瞬时动作 @CCActionInstanse@ ,延时动作 @CCActionInterval@
table(table table-bordered). |_.动作|_.说明|_.构造 @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@ 结构体| |@CCBlink@|闪|@CCBlink::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@注,是否恢复原始帧| table(table table-bordered). |_.动作组合方式|_.说明|_.构造 @CCAction@|_.参数| |@CCSequence@|动作序列,有序地一个一个执行动作|@CCSequence::actions(actionTo, actionToBack, NULL)@|动作1、运作2、...、后面必须加NULL表示没有了| |@CCRepeatForever@|重复执行动作|@CCRepeatForever::actionWithAction(actionTo)@|动作| |@CCSpawn@|同时执行动作|@CCSpawn::actions(actionTo, actionToBack, NULL)@|动作1、运作2、...、后面必须加NULL表示没有了| table(table table-bordered). |_.动作回调|_.说明|_.构造|_.参数| |@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); // 运行动作
@CCMenu@ :菜单,参考: "http://www.cocos2d-x.org/reference/native-cpp/d1/da0/classcocos2d_1_1_c_c_menu.html":http://www.cocos2d-x.org/reference/native-cpp/d1/da0/classcocos2d_1_1_c_c_menu.html
// 创建菜单Item
CCMenuItem* 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创建Item
CCMenuItem* 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); // 最后必须加NULL
void MainLayer::onNewGame(CCObject* pSender) {
// 回调
}
@CCLayerMultiplex@ :多个层,参考: "http://www.cocos2d-x.org/reference/native-cpp/d3/d7e/classcocos2d_1_1_c_c_layer_multiplex.html":http://www.cocos2d-x.org/reference/native-cpp/d3/d7e/classcocos2d_1_1_c_c_layer_multiplex.html
CCLayer* pLayer1 = new MenuLayer1(); CCLayer* pLayer2 = new MenuLayer2(); CCLayer* pLayer3 = new MenuLayer3(); CCLayer* pLayer4 = new MenuLayer4(); 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);
@CCProgressTimer@ :进度条
table(table table-bordered). |_.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));
@CCTransitionScene@ :场景转换效果
table(table table-bordered). |_.效果|_.说明|_.方法|_.参数| |@CCTransitionFade@|以颜色淡出淡入|@transitionWithDuration(时间, 场景, ccBLACK)@|@ccc3(255,0,0)@ :三原色| |@CCTransitionFlipX@|水平翻转屏幕|@transitionWithDuration(时间, 场景, kOrientationRightOver)@|@kOrientationLeftOver@ :从左往右
CCTransitionFade * tfScene = CCTransitionFade::transitionWithDuration(2, new CCScene(), ccBLACK);
if (tfScene) {
CCDirector::sharedDirector()->replaceScene(pScene);
}
节点嵌套节点
CCSprite * pSprite1 = new CCSprite(); // 一个精灵相当于一个节点 CCSprite * pSprite2 = new CCSprite(); pSprite1->addChild(pSprite2); // 一个节点嵌套另一个节点 pSprite1->runAction(action); // 如果父节点执行动作,那此时所有子节点都会执行该动作。
节点删除与清除
prettyprint(node, false/true); // 节点,false不清理正在运行的动作、true清理正在运行的动作
schedule(schedule_selector(Class::callback), 1); // 回调,时间;每隔1秒执行一次
void Class::callback(ccTime dt) {
}
unschedule(schedule_selector(Class::callback)); // 取消定时器
*CCObject对象的内存管理相关接口*
// 引用次数+1 virtual void CCObject::retain(void); // 引用次数-1;若引用计数器=0,则delete this; virtual void CCObject::release(void); // helper方法,快速判断当前对象只有唯一引用 bool CCObject::isSingleRefrence(void); // 返回引用次数 unsigned int CCObject::retainCount(void); // 自动释放(自动管理) CCObject* CCObject::autorelease(void);
*手动管理内存*
class MyClass: public cocos2d::CCObject
{
public:
MyClass();
~MyClass();
}
MyClass * obj = new MyClass();
...
obj->release(); // 谁生成(new、copy)谁负责release
// 谁retain,谁负责release。
obj->retain();
...
obj->release();
// 传递赋值时,需要先retain形参,后release原指针,最后赋值。(注意,因为这里没有使用自赋值检查,所以这组顺序不能错。)
void CCNode::setGrid(CCGridBase* pGrid)
{
CC_SAFE_RETAIN(pGrid);
CC_SAFE_RELEASE(m_pGrid);
m_pGrid = pGrid;
}
*自动管理内存*
MyClass * obj = new MyClass(); obj->autorelease(); // 每帧绘制结束,就自动release池中的对象。