天天看点

cocos2d学习笔录1CCDirector的主要作用:CCNode 常用API:接受加速计事件:

1.访问和改变场景;

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

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

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

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

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是多点触摸

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;

     label->setString(str->getCString());

//CCCallFuncO

CCString *str = CCString::create("object参数");

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());

本文转蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366397,如需转载请自行联系原作者

继续阅读