CCDirector的主要作用:
 
1.访问和改变场景; 

2.访问cocos2d-x的配置细节 

3.访问视图(OPENGL,UIVIEW,UIWINDOW); 

4.暂停,恢复和结束游戏; 

5.在UIKit和OpenGL之间切换坐标 

 

CCNode 常用API:
 
1.生成一个新的节点: 

CCNode*childNoe = CCNode::create(); 

2.将新节点添加为子节点 

myNode>addChile(childNode,0,123); //0是层级,123是tag属性 

3.获取子节点: 

CCNode *retrevedNode = myNode->getChildByTag(123); 

4.通过tag删除子节点,cleanup会停止任何运行中的动作: 

myNode->removeChildByTag(123,true); 

5.通过节点指针删除节点: 

myNode->removeChild(retrievedNode); 

6.删除一个节点的所有子节点: 

myNode->removeAllChildenWithCleanup(true); 

7.从myNode的父节点删除myNode: 

myNode->removeFromParentAndCleanup(true); 

 

使用动作: 

1.一下是一个动作的申明: 

CCAction *action = CCBlind::create(10,20); 

action->setTag(234); 

2.运行这个动作会让节点闪烁: 

myNode->runAction(action); 

3.如果你想再以后使用此动作,你可以用tag获取: 

CCAction*retrievedAction = myNode->getActionByTag(234); 

4.你可以用tag停止相关连的动作: 

myNode->stopActionByTag(234); 

5.或者你也可以用动作指针停止动作: 

myNode->stopAction(action); 

6.你可以停止所有在此节点上运行的动作: 

myNode->stopAllActions(); 

 

如果你想运行不同的方法,或者是每秒调用10次更新的方法的话,你应该使用一下代码: 

void HelloScene::init() 

{ 

     this->schedule(schedule_selector(HelloWorld::updataTen),0.1f); 

} 

 

void HelloScene::updateTen() 

{ 

     //此方法将根据时间间隔来调用,每隔10秒 

} 

如果时间间隔(interval)为0的话,你应该使用scheduleUpdate方法。不过,如果你想之后停止对某个指定更新的方法的预定信息的话,上述代码更加合适。因为scheduleUpdate方法没有停止预定信息的功能。 

停止预定信息 

unschedule 

OC中可以用一个隐式指针:_cmd 

//用_cmd关键词停止当前方法的预定 

[self unschedule:_cmd]; 

局限于OC 

 

//随机数的产生 

CCRANDOM_0_1 随机生成0-1之间的随机数 

//优先级设置 

this->scheduleUpdateWithPriority(0); 

这里的优先级顺序是从低到高 

 

 

CCScene是场景视图的第一个节点。通常CCScene的子节点都是继承自CCLayer。 

问题:如果两个界面都是100M,那么瞬间就是200M太大了,怎么解决? 

方法:可以加载一个loading界面来过渡! 

CCTransitionFade*fade = CCTransitionFade::transitionWithDuration(1.f,Scene2::scen(),ccBLACK);  //最后一个参数是默认参数,可以不写,他默认ccBlack 

//CCDirector::sharedDirector()->pushScene(fade); 

//CCDirector::sharedDirector()->repleaseScene(fade); 

push方法不会调用原来场景的析构方法,而replease方法会调用原来场景的内存,会调用析构函数。 

问题:哪种情况用push来切换场景,哪种情况用replease来切换场景? 

方法:如果是暂停来切换暂停场景,那么用pushScene,原来的游戏场景不需要释放,如果是游戏场景的切换,一般用repleaseScene方法来切换。 

push一个场景必须pop才能释放内存,一般用replease来切换场景 

 

//触摸注册事件//如果没有这个,默认的是多点触摸,Target是单点,Stand是多点触摸
void HelloWorld::registerWithTouchDispatcher()
{ 
   CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true); //第二个参数是优先级,越低的优先级越高,优先响应,true是触摸吞噬,如果是true的话,那么触摸就被它获取,后面的view不在接受
} 


ccTouchBegan返回的是一个BOOL值,如果是true的话,那就意味着你不想让当前的触摸事件传到到其他触摸事件处理器。你实际上是“吞下了”这个触摸事件。

接受加速计事件:
 
和触摸输入一样,加速计必须在启用以后才能接受加速计事件:
this->setAccelerometerEnabled(true);
同样的,层里面要加入一个特定的方法来接受加速计事件:
void HelloWorld::didAccelerate(CCAcceleration*pAccelerationValue)
{
     CCLOG("pAccelerationValue:X:%f/y:%f/z:%f",pAccelerationValue.x,pAccelerationValue.y,pAccelerationValue.z);
}
 

注意:
资源文件名的大小写,真机上是区分大小写的,而模拟器是不区分的。

事件间隔动作:
CCMoveTo*move = CCMoveTo::create(3,ccp(100,200));
myNode->runAction(move);

重复动作:
CCRotateBy *rotateBy = CCRotateteBy::create(2,360);
CCRepeatForever*repeat = CCRepeatForever::cease(rotateBy);

舒缓动作:
CCMoveTo *move = CCMoveTo::create(3,cpp(100,200));
//节点慢慢启动,在移动中加速
CCEaseInOut*ease = CCEaseInOut::create(move,4);
myNode->runAction(ease);

cocos2d实现了一下CCEaseAction类:
例如:CCEaseBackIn

动作序列CCSequence
CCSequence *seq = [CCSequence actions:tint1,tint2,nil];
[label runAction:seq];

回调函数:
//CCCallFunc是执行对应的回调函数,其中回调函数不可带参数。一般使用静态成员函数create创建实例
CCCallFunc *callFunc = CCCallFunc::create(this,callfunc_selector(HelloWorld::funC_CallBack));
pLabel->runAction(callFunc);
//带参数的回调CCCallFuncN,其中带一个参数,一般由静态成员create创建实例
CCCallFuncN *callFuncN = CCCallFuncN::create(this,callfuncN_selector(HelloWorld::funcN_CallBack));
pLabel->runAction(callFuncN);

void HelloWorld::funcN_CallBack(void *sender)
{
     CCLabelTTF *label = (CCLabelTTF *)sender;
     label->setStrign("hello");
     CCLog("CallFuncN的回调");
}
//带两个参数的回调
CCString *str = CCString::create("data参数");
str->retain();
CCCallFuncND *callFuncND = CCCallFuncND::create(this,callfuncND_selector(HelloWorld::funcND_CallBack),str); //最后一个参数是void*可以是任意类型
pLabel->runAction(callFuncND);

void HelloWorld::funcN_CallBack(void *sender,void *data)
{
     CCString *str = (CCString *)data;
     CCLabelTTF *label = (CCLabelTTF *)sender;
     label->setString(str->getCString());
}

//CCCallFuncO
CCString *str = CCString::create("object参数");
str->retain();
CCCallFuncO*callFuncO = CCCallFuncO::create(this,callfuncO_selector(HelloWorld::funcO_CallBack),str);
pLabel->runAction(callFuncO);

void HelloWorld::funcO_CallBack(CCObject *object)
{
     CCString * = (CCString *)object;
     CCLog("%s",str->getCString());
}