声 明本教程仅用于初学cocos2dx同学使用,内容由本人(孤狼)学习过程中笔记编写,本教程使用cocos2dx版本为2.1.4。本教程内容可以自由转载,但必须同时附带本声明,或注明出处。gl.paea.cn版权所有。
大家好,欢迎回到“和屌丝一起学cocos2dx”系列教程,上节我们说到了“draw绘图”,可能里面有些东西大家看起来感觉和大家买到的教材不一样,这是很正常的,因为大家买到的教材所说的东西都是老版本的了比如说Himi的教材,就是使用的2.0.2版本,但是里面有些函数当然还是少数在2.1.4里面已经不能用了,或者改变了使用方法。所以大家可不能死学,一定要变通啊。如果发现实现不了呢,记得去查一下API。API里面给出的就是这个函数的用法等信息,所以是最权威的哦。好了我们开始今天的教程吧,今天我们说一下,更新函数。
【一】:为啥要这个
大家都知道,一个程序要是在运行不能说让他显示了,让他播放了,这就叫运行, 我们要让他时时刻刻都在根据我们定的规矩变化着,比如电子表,如果显示就算运行,那么不走的话,岂不是没有意义。更新函数,就是这个大的自动循环体,我们把规矩放进去,他每隔一定时间就会判断一下我们的规矩,看看是不是该动了,是不是该执行某条命令了。
【二】:函数
1.scheduleUpdate
2.[1]schedule("目标函数");//等同于scheduleUpdate
2.[2]schedule("目标函数","更新时间f");
2.[3]schedule("目标函数","更新时间f","更新次数","每次等待时间f");
3.scheduleOnce("目标函数","等待时间f");
区别1:scheduleUpdate刷新间隔为每一帧,schedule刷新间隔可以自己设置(默认1帧),scheduleOnce只执行一次。
区别2:scheduleUpdate函数会自动刷新当前类中的update函数体,而schedule和scheduleOnce可以指定刷新的函数体
【三】:示例
老规矩不说了建项目。Updatedemo
Updatedemo.h
1.我们要定义一个更新函数update();
void update(float tmd); //这里一定要传参,否则不会调用哦
2.我们再定义一个更新函数myupdate();
void myupdate(float tmd);
3.我们再定义一个更新函数myupdate3();
void myupdate(float tmd);
4.在定义3个变量用于做判断
int a;
int b;
int c;
Updatedemo.cpp
1.我们先设置三个精灵,让三个函数以三种速度移动。
CCSize mysize=CCDirector::sharedDirector()->getWinSize();
CCSprite * sp1=CCSprite::create("CloseNormal.png");
sp1->setPosition(ccp(0,mysize.height-50));
this->addChild(sp1,0,521);
CCSprite * sp2=CCSprite::create("CloseNormal.png");
sp2->setPosition(ccp(0,mysize.height-150));
this->addChild(sp2,0,522);
CCSprite * sp3=CCSprite::create("CloseNormal.png");
sp3->setPosition(ccp(0,mysize.height-250));
this->addChild(sp3,0,523);
a=1;
b=1;
c=1;
2.我们要先在初始化函数里调用scheduleUpdate函数和schedule函数以及scheduleOnce函数。
scheduleUpdate();
schedule(schedule_selector(Updatedemo::myupdate),1.0f);
scheduleOnce(schedule_selector(Updatedemo::myupdate2),3.0f);
3.实现我们的3个更新函数。
void Updatedemo::update(float tmd){
CCSprite * sp=(CCSprite*)this->getChildByTag(521);
if(a==1){
sp->setPositionX(sp->getPositionX()+1);
}else{
sp->setPositionX(sp->getPositionX()-1);
}
if(sp->getPositionX()<0){
a=1;
}
if(sp->getPositionX()>480){
a=-1;
}
}
void Updatedemo::myupdate(float tmd){
CCSprite * sp=(CCSprite*)this->getChildByTag(522);
if(b==1){
sp->setPositionX(sp->getPositionX()+10);
}else{
sp->setPositionX(sp->getPositionX()-10);
}
if(sp->getPositionX()<0){
b=1;
}
if(sp->getPositionX()>480){
b=-1;
}
}
void Updatedemo::myupdate2(float tmd){
CCSprite * sp=(CCSprite*)this->getChildByTag(523);
if(c==1){
sp->setPositionX(sp->getPositionX()+100);
}else{
sp->setPositionX(sp->getPositionX()-100);
}
if(sp->getPositionX()<0){
c=1;
}
if(sp->getPositionX()>480){
c=-1;
}
}
好了,到这里就可以去运行了。我们来一起看看效果吧。
好了,这里最上面的sp1是每帧都运行,中间的sp2是1秒一次,最下面的sp3只运行一次。你,学会了吗?