本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010
对于一个游戏而言,只存在精灵、层、场景等元素是不完整的,而缺少的正是这些元素的逻辑。例如精灵移动的
逻辑、动画逻辑、碰撞逻辑等,而这些逻辑一般情况下是需要及时做出反馈的,所以我们这些逻辑将放置在更新函数
中不停地循环判定。
一、scheduleUpdate函数
此函数是CCNode的函数,每个CCNode只要调用scheduleUpdate()更新函数,那么这个CCNode就会响应当前类
的update(float dt)函数。
1、示例代码如下所示。
<1> 首先新建Cocos2D-X项目,在HelloWorldScene.h头文件中定义update函数。
//更新函数
void update(float dt);
<2> 然后在HelloWorldScene.cpp文件的init函数中添加如下代码。
bool HelloWorld::init()
{
bool bRet = false;
do
{
//////////////////////////////////////////////////////////////////////////
// super init first
//////////////////////////////////////////////////////////////////////////
CC_BREAK_IF(! CCLayer::init());
CCSprite* sp = CCSprite::create("Icon.png");
sp->setPosition(ccp(80,100));
addChild(sp,0,922);
//更新函数
scheduleUpdate();
bRet = true;
} while (0);
return bRet;
}
<3> 最后实现update更新函数。
void HelloWorld::update(float dt){
// 停止更新
// unscheduleUpdate();
CCSprite*sp =(CCSprite*)this->getChildByTag(922);
if(sp->getPositionX()<260){
sp->setPosition(ccpAdd(sp->getPosition(), ccp(2,2)));
}else{
sp->setPosition(ccpAdd(sp->getPosition(), ccp(2,-2)));
}
}
代码首先定义了一个精灵且设置tag索引值992,然后在更新函数中通过tag获取其精灵,让其坐标不断发生变化。
2、示例效果图。
运行项目,可以看到这个精灵在不断的移动。
二、schedule函数
schedule的作用与scheduleUpdate()函数相同,但是scheduleUpdate()默认每一帧都会调用update函数,而
schedule则可以自定义调用更新函数的时间间隔。
1、两种Schedule函数说明如下。
<1> schedule(SEL_SCHEDULE selector,float interval)
参数1:目标更新函数。
参数2:刷新间隔。
<2> schedule(SEL_SCHEDULE selector)
作用:此函数默认每一帧都调用目标函数。
参数:目标更新函数。
注意:刷新间隔时间的单位是s(秒)。
2、示例代码如下。
<1> 首先新建Cocos2D-X项目,在HelloWorldScene.h头文件中定义myUpdate函数。
//自定义更新函数
void myUpdate(float dt);
<2> 然后在HelloWorldScene.cpp文件的init函数中添加如下代码。
bool HelloWorld::init()
{
bool bRet = false;
do
{
CC_BREAK_IF(! CCLayer::init());
CCSprite* sp = CCSprite::create("Icon.png");
sp->setPosition(ccp(80,100));
addChild(sp,0,922);
//自定义更新函数 每一帧都调用
//schedule(schedule_selector(HelloWorld::myUpdate));
//自定义更新函数 每秒执行一次
schedule(schedule_selector(HelloWorld::myUpdate),1.f);
bRet = true;
} while (0);
return bRet;
}
<3> 最后实现自定义的myUpdate更新函数。
void HelloWorld::myUpdate(float dt){
// 停止更新
// unschedule(schedule_selector(HelloWorld::myUpdate));
CCSprite*sp =(CCSprite*)this->getChildByTag(922);
if(sp->getPositionX()<260){
sp->setPosition(ccpAdd(sp->getPosition(), ccp(5,5)));
}else{
sp->setPosition(ccpAdd(sp->getPosition(), ccp(5,-5)));
}
}
3、示例效果图。
三、停止更新函数方法
1、停止默认的update更新函数。
unscheduleUpdate();
2、停止自定义更新函数。
unschedule(SEL_SCHEDULE selector);
参数:自定义的更新函数。
3、停止所有更新函数。
unscheduleAllSelectors()