cocos2dx 帧数怎样通过帧数来执行的函数

Cocos2d-x学习笔记(十)scheduler及Cocos2dx的回调
看完了前九节的学习笔记,我们已经基本上可以做一些简单的界面了,但是如果我们想要让东西不断动起来怎么办呢?答案很简单,用scheduler,我们先来看看schedule的用法吧。
scheduler用法
在之前CCNode的学习中,我们介绍了部分schedule的方法,现在我们来回顾一下:
// 返回指定计划是否正在执行
bool isScheduled(SEL_SCHEDULE selector);
// 设置帧更新计划,每帧都调用update方法,相当于schedule了update方法,实际调用了scheduleUpdateWithPriority,设置优先级为0
void scheduleUpdate(void);
// 取消帧更新计划
void unscheduleUpdate(void);
// 设置帧更新计划,每帧都调用update方法,相当于schedule了update方法,在CCSchedule更新update时,会根据schedule的优先级排序调用
void scheduleUpdateWithPriority(int priority);
* 执行某个计划
* @param interval
触发间隔时间(单位:秒),0为每帧都触发,如果interval = 0,推荐使用scheduleUpdate()代替
* @param repeat
重复次数(实际执行次数为:重复次数+1)
* @param delay
延迟启动时间(单位:秒)
void schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay);
void schedule(SEL_SCHEDULE selector, float interval);
void schedule(SEL_SCHEDULE selector);
// 执行指定计划一次
void scheduleOnce(SEL_SCHEDULE selector, float delay);
// 取消指定计划
void unschedule(SEL_SCHEDULE selector);
// 取消所有计划
void unscheduleAllSelectors(void);
// 恢复/暂停节点的计划和动作
void resumeSchedulerAndActions(void);
void pauseSchedulerAndActions(void);
void CCNode::scheduleUpdate()
scheduleUpdateWithPriority(0);
void CCNode::scheduleUpdateWithPriority(int priority)
// 调用CCSchedule启动指定节点的帧更新,并设置优先级
m_pScheduler-&scheduleUpdateForTarget(this, priority, !m_bRunning);
void CCNode::unscheduleUpdate()
// 调用CCSchedule的取消指定节点的指定计划
m_pScheduler-&unscheduleUpdateForTarget(this);
if (m_nUpdateScriptHandler)
CCScriptEngineManager::sharedManager()-&getScriptEngine()-&removeScriptHandler(m_nUpdateScriptHandler);
m_nUpdateScriptHandler = 0;
void CCNode::scheduleOnce(SEL_SCHEDULE selector, float delay)
// 调用schedule,将间隔时间设置为0秒,将重复次数设置为0此,即只执行一次
this-&schedule(selector, 0.0f, 0, delay);
void CCNode::schedule(SEL_SCHEDULE selector)
// 调用schedule,将间隔时间和延迟启动时间设置为0秒
this-&schedule(selector, 0.0f, kCCRepeatForever, 0.0f);
void CCNode::schedule(SEL_SCHEDULE selector, float interval)
// 调用schedule,将重复次数设置为永远,延迟启动时间为0秒 #define kCCRepeatForever (UINT_MAX -1)
this-&schedule(selector, interval, kCCRepeatForever, 0.0f);
void CCNode::schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)
// 确保待执行计划不为空,两次计划执行时间间隔大于0
CCAssert( selector, Argument must be non-nil);
CCAssert( interval &=0, Argument must be positive);
// 调用CCSchedule的启用指定节点的指定计划
m_pScheduler-&scheduleSelector(selector, this, interval , repeat, delay, !m_bRunning);
void CCNode::unschedule(SEL_SCHEDULE selector)
// 确保待取消计划不为空
if (selector == 0)
// 调用CCSchedule的取消指定节点的指定计划
m_pScheduler-&unscheduleSelector(selector, this);
void CCNode::unscheduleAllSelectors()
// 调用CCSchedule的取消指定节点所有计划
m_pScheduler-&unscheduleAllForTarget(this);
void CCNode::resumeSchedulerAndActions()
// 调用CCSchedule和CCActionManager的暂停
m_pScheduler-&resumeTarget(this);
m_pActionManager-&resumeTarget(this);
void CCNode::pauseSchedulerAndActions()
// 调用CCSchedule和CCActionManager的恢复
m_pScheduler-&pauseTarget(this);
m_pActionManager-&pauseTarget(this);
看到这,我们做一个简单的计划任务吧,假设我们当前在做飞机大战,现在需要每0.5s添加一辆飞机:
schedule(schedule_selector(GameScene::addEnemy), 0.5f);
Cocos2dx的回调
在代码中我们看到了许多诸如SEL_SCHEDULE的变量,在最后实现一个定时任务的时候也看到了schedule_selector,它们究竟是什么?其实它就是实现回调的核心,我们一起看看他们的真面目吧:
typedef void (CCObject::*SEL_SCHEDULE)(float);
typedef void (CCObject::*SEL_CallFunc)();
typedef void (CCObject::*SEL_CallFuncN)(CCNode*);
typedef void (CCObject::*SEL_CallFuncND)(CCNode*, void*);
typedef void (CCObject::*SEL_CallFuncO)(CCObject*);
typedef void (CCObject::*SEL_MenuHandler)(CCObject*);
typedef void (CCObject::*SEL_EventHandler)(CCEvent*);
typedef int (CCObject::*SEL_Compare)(CCObject*);
#define schedule_selector(_SELECTOR) (SEL_SCHEDULE)(&_SELECTOR) // schedule计划回调
#define callfunc_selector(_SELECTOR) (SEL_CallFunc)(&_SELECTOR) // 动作回调
#define callfuncN_selector(_SELECTOR) (SEL_CallFuncN)(&_SELECTOR)
#define callfuncND_selector(_SELECTOR) (SEL_CallFuncND)(&_SELECTOR)
#define callfuncO_selector(_SELECTOR) (SEL_CallFuncO)(&_SELECTOR)
#define menu_selector(_SELECTOR) (SEL_MenuHandler)(&_SELECTOR) // 菜单回调
#define event_selector(_SELECTOR) (SEL_EventHandler)(&_SELECTOR) // 事件回调
#define compare_selector(_SELECTOR) (SEL_Compare)(&_SELECTOR) //
简单分析一下define和typedef:
#define schedule_selector(_SELECTOR) (SEL_SCHEDULE)(&_SELECTOR)
#define: 只是一个加单的字符串替代宏,#define A B 的意思是:A和B是一样的东西,只不过换了个写法,经常用在:用一个简单的字符串代替一串复杂的字符串、用一些有意义的单词组合来代表某些值。
typedef void (CCObject::*SEL_SCHEDULE)(float);
typedef: 定义一种类型的别名, typedef void (*fff)(float) 表示fff是一个函数,这个函数的返回类型是 void ,只有一个 float 类型的参数。
CCCallFunC家族
在这里,我们已经学会了schedule_selector的用法,接下来我们看看callfunc_selector家族的用法吧,它们主要在我们需要在一个动作完成之后需要调用某个函数时使用:
class HelloWorld : public cocos2d::CCLayerColor
virtual bool init();
static cocos2d::CCScene* scene();
void callBack();
void callNodeBack(CCNode* sender);
void callNodeBack(cocos2d::CCNode *sender, void * data);
void callObjectBack( CCObject * data);
CREATE_FUNC(HelloWorld);
void HelloWord::init{
CCSprite* player = CCSprite::create(Icon.png);
player-&setPosition(ccp(100, 100));
this-&addChild(player);
CCMoveTo* action = CCMoveTo::create(1, ccp(200, 200));
// CCCallFunc的功能非常简单,它只能简单地实现在动作序列中帮助我们调用一个函数的功能。
CCCallFunc* call
= CCCallFunc::create(this, callfunc_selector(HelloWorld::callBack));
// 下面这行代码是创建一个动作序列
CCFiniteTimeAction* seq = CCSequence::create(action,call,NULL);
player-&runAction(seq);
// CCCallFuncN的回调,既能够调用一个方法还能够将调用的对象传过去
这里的调用对象就是player
它是个精灵对象
CCCallFuncN* callN = CCCallFuncN::create(this, callfuncN_selector(HelloWorld::callNodeBack));
CCFiniteTimeAction* seq2 = CCSequence::create(action,callN,NULL);
player-&runAction(seq2);
// CCCallFuncND的回调,先创建一个字典
CCDictionary* dic = CCDictionary::create();
dic-&retain();
dic-&setObject(CCString::create(zxcc), 1);
// CCCallFuncND可以传递一个任意数据类型,例如,我们此时传递一个字典
CCCallFuncND* callND = CCCallFuncND::create(this, callfuncND_selector(HelloWorld::callNodeBack),(void*)dic);
CCFiniteTimeAction* seq3 = CCSequence::create(action,callND,NULL);
player-&runAction(seq3);
// CCCallFuncO的回调,我们创建一个精灵
CCSprite* player2 = CCSprite::create(player2.png);
player2-&setPosition(ccp(300, 300));
this-&addChild(player2);
// CCCallFuncO传值的类型只能为CCObject类型,例子为先移动一个精灵,再移动另一个精灵
CCCallFuncO* callO = CCCallFuncO::create(this, callfuncO_selector(HelloWorld::callObjectBack), player2);
CCFiniteTimeAction* seq4 = CCSequence::create(action,callO,NULL);
player-&runAction(seq4);
//CCCallFunc的回调函数
void HelloWorld::callBack()
CCLog(CCCallFunc);
//CCCallFuncN的回调函数
void HelloWorld::callNodeBack(cocos2d::CCNode *sender)
CCSprite* player = (CCSprite*)
CCLog(%f,player-&getPosition().x);
//CCCallFuncND的回调函数
void HelloWorld::callNodeBack(cocos2d::CCNode *sender, void * data)
CCDictionary* dic = (CCDictionary*)
CCString* str = (CCString*)(dic-&objectForKey(1));
CCLog(%s,str-&getCString());
//CCCallFuncO的回调函数
void HelloWorld::callObjectBack(cocos2d::CCObject *data)
CCSprite* player = (CCSprite*)
player-&runAction(CCMoveTo::create(1, ccp(1 ,90)));
剩下三种回调我们将在接下来的学习笔记中继续讲到,有了目前学的回调,是不是觉得已经可以做一个简单的飞机大战了呢?8511人阅读
cocos2d-x游戏引擎(76)
这段时间新项目涉及到很多animation,有时要知道当前动画播放到了第几帧,那么如何获取是第几帧呢?有一个很龊的方法,就是根据时间判断,因为每一帧的时间我们是预先定了的,所以自己设置schedule多少时间之后开始执行。还有一个好点的办法,就是真的获取到是第几帧:假设有一个CCAnimation* anim,由5张图组成。将这个anim包装成CCAnimate* animate。使用的时侯sprite-&runAction(animate),播放动画。这里我们来获取第几帧:int currentAnimIndex = 0; //精灵当前播放的是第几帧for(int i = 0; i & 5; i++){&&//5张图5帧&if(prite-&displayedFrame() == anim-&getFrames()-&getObjectAtIndex(i))&&{& & //这个i返回的只是一个索引,如果帧数是从1开始计算就要+1& & currentAnimIndex = i+1;&&}}prite-&displayedFrame()获取的是当前精灵动画所显示的帧精灵指(CCSpriteFrame).anim-&getFrames()获得的是整个动画所保存的帧精灵指针数组(CCSpriteFrame)其实我们创建animation时所添加进去的图片文件都会转化成CCSpriteFrame保存起来。animation-&getFrames()-&getObjectAtIndex(i)获取的是animation中帧精灵数组中某个索引的元素,这个元素也是CCSpriteFrame.获取的原理就是,我通过sprite-&displayedFrame()获得我当前精灵所播放的CCSpriteFrame,然后去跟我的动画数组(CCSpriteFrame数组)去做比较,取得对应元素在数组中的下标从而获取当前精灵播放的是第几帧。更新 如果无法获取第几帧请看这里&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1031042次
积分:11398
积分:11398
排名:第1324名
原创:148篇
评论:489条
猴子,一个热爱游戏编程的家伙。专注移动游戏跨平台开发。欢迎志同道合的朋友一起学习交流开发技术!
(粉丝1764)
文章:13篇
阅读:29679
文章:32篇
阅读:163562
文章:68篇
阅读:664960
Blue Path - iOS7风格一笔画游戏
Scribbles Ball - Physics Game
Unravel Line - iOS7智力游戏
(1)(1)(1)(1)(2)(1)(3)(4)(3)(1)(1)(1)(1)(3)(1)(2)(2)(1)(1)(2)(2)(1)(1)(2)(3)(1)(2)(1)(3)(1)(5)(1)(1)(1)(1)(4)(4)(1)(2)(1)(4)(6)(2)(10)(6)(8)(3)(2)(6)(5)(15)(14)cocos2dx中怎么实现游戏加速,怎么保证帧率不稳的情况下保证人物移动速度平稳
急求去泰国曼谷普吉岛自由行最好下什么地图软件和翻译软件
答: 好在有许多成熟的安全和网络技术,例如虚拟私有网络(VPN)和防火墙等,能够极大地提高Web服务应用的安全和性能,让开发者拥有选择安全技术的自由,而不是非得使用尚...
答: 某些ADSL调制解调器使用USB接口与电脑相连,需要在电脑上安装指定的软件以添加虚拟网卡来进行通信
大家还关注
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区}

我要回帖

更多关于 cocos2dx update函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信