cocos教学类cocos2dx入门视频教程哪个好?

查看: 724|回复: 0
cocos2dx三种定时器的使用
千锋币6207
在线时间790 小时
技术方向android
主题帖子积分
??& & cocos2dx三种定时器的使用以及停止schedule,scheduleUpdate,scheduleOnce
今天白白跟大家分享一下cocos2dx中定时器的使用方法。首先,什么是定时器呢?或许你有时候会想让某个函数不断的去执行,或许只是执行一次,获取你想让他每隔几秒执行一次,ok,这些都可以统统交给定时器来解决。cocos2dx中有三种定时器:schedule,scheduleUpdate,scheduleOnce。了解其功能便会发现定时器真是太方便了,废话不多说,我们逐一学习一下。1、scheduleUpdate加入当前节点后,程序会每帧都会自动执行一次默认的Update函数。(注:一定是Update函数哦,若想调用其他自己命名的函数则使用schedule)看例子,走起。首先在HelloWord类的头文件中声明Update函数:[cpp] view plaincopyprint?void Update(float dt); //注意参数类型
void Update(float dt); //注意参数类型复制代码然后在HelloWorld类源文件中实现函数Update:
[cpp] view plaincopyprint?void HelloWorld::Update(float dt)
{
CCLOG(&baibai&);
}
void HelloWorld::Update(float dt)
{
CCLOG(&baibai&);
}复制代码现在我们可以调用了,在需要他不断执行的地方加入调用的代码就ok:
[cpp] view plaincopyprint?this-&scheduleUpdate(); //this是当前节点,如layer,所以可以省略啦。
this-&scheduleUpdate(); //this是当前节点,如layer,所以可以省略啦。复制代码运行之后你将会看到不断有baibai被打印出来2、scheduleUpdate可以没隔几秒执行某个自定义的函数,来看代码:首先还是在HelloWorld中声明所要执行的函数:
[cpp] view plaincopyprint?void Move(float dt);
void Move(float dt);复制代码然后在源文件实现:
[cpp] view plaincopyprint?void HelloWorld::Move(float dt)
{
CCLOG(&baibai&);
}
void HelloWorld::Move(float dt)
{
CCLOG(&baibai&);
}复制代码现在去执行他,注意参数哦
[cpp] view plaincopyprint?scheduleOnce(schedule_selector(HelloWorld::Move), 1.0f);//每隔1.0f执行一次,省略参数则表示每帧都要执行
scheduleOnce(schedule_selector(HelloWorld::Move), 1.0f);//每隔1.0f执行一次,省略参数则表示每帧都要执行复制代码运行之后,baibai每隔1.0f才会被打印一次。3、scheduleOnce功能:在几秒之后执行,并且只执行一次。我们就执行上面所写过的Move函数吧:
[cpp] view plaincopyprint?scheduleOnce(schedule_selector(HelloWorld::Move), 1.0f); //在1.0f之后执行,并且只执行一次。
scheduleOnce(schedule_selector(HelloWorld::Move), 1.0f); //在1.0f之后执行,并且只执行一次。复制代码运行一下,baibai只是被打印了一次就完了。。。ok,定时器的调用已经讲完,大家不妨自己写一些函数体验一下。但是怎么让定时器停止呢?1、停止执行自己定义函数的定时器:
[cpp] view plaincopyprint?this-&unschedule(schedule_selector(HelloWorld::Move));
this-&unschedule(schedule_selector(HelloWorld::Move));复制代码2、停止默认定时器:
[cpp] view plaincopyprint?this-&unscheduleUpdate();
this-&unscheduleUpdate();复制代码3、停止所有定时器:
[cpp] view plaincopyprint?this-&unscheduleAllSelectors();
this-&unscheduleAllSelectors();复制代码1.概况CCNode内部封装了一个[cpp] view plaincopyCCScheduler *m_pS
正是通过它我们可以很轻松地完成一些定时功能,所以定时器是节点所具备的功能。定时器分为2种,一种是更新定时器,执行的频率是每帧执行一次,另一种则是自定义回调函数的定时器(最小值是一帧),关于回调函数和函数指针的相关基础可参见。
2.API[cpp] view plaincopy//更新定时器,每帧调用1次。每个节点只能有1个被调度的update函数voidscheduleUpdate(void);//卸载更新定时器voidunscheduleUpdate(void);//自定义定时器,如果重复调用,那调用间隔会更新,而不会再次调用//interval,调用时间间隔,如果为0,建议使用scheduleUpdate//repeat,回调函数会被执行repeat+1次,kCCRepeatForever是无限次调用//delay,第一次执行前的延时voidschedule(SEL_SCHEDULE selector, floatinterval, unsigned intrepeat, floatdelay); voidschedule(SEL_SCHEDULE selector, floatinterval); voidscheduleOnce(SEL_SCHEDULE selector, floatdelay); voidschedule(SEL_SCHEDULE selector); //卸载自定义定时器voidunschedule(SEL_SCHEDULE selector); voidunscheduleAllSelectors(void);//恢复所有定时器和动作,OnEnter调用voidresumeSchedulerAndActions(void);//暂停所有定时器和动作,OnExit调用voidpauseSchedulerAndActions(void);//scheduleUpdate每帧调用virtualvoidupdate(floatdelta);
3.示例3.1.更新定时器[cpp] view plaincopy//开启定时器this-&scheduleUpdate();//虚函数updatevoidHelloWorld::update(floatdelta) { CCLog(&%f&,delta);} //输出,这里设置了60fps,调用间隔1/60s0.016667 0.016676 0.016657 0.016669
3.2.自定义定时器[cpp] view plaincopy//开启定时器,延时2s执行,执行3+1次,执行间隔1sthis-&schedule(schedule_selector(HelloWorld::log),1,3,2);//回调函数voidHelloWorld::log(floatdt) { CCLog(&schedule&);} //输出2.004532 1.005827 1.000238 1.001019
4.schedule_selector和SEL_SCHEDULE看到上面的schedule_selector了吧,这又是个什么玩意?看看它的宏定义。[cpp] view plaincopy#defineschedule_selector(_SELECTOR) (SEL_SCHEDULE)(&_SELECTOR)
原来是把函数指针转化为SEL_SCHEDULE型指针,那SEL_SCHEDULE又是什么?[cpp] view plaincopytypedefvoid(CCObject::*SEL_SCHEDULE)(float);
也没啥,就是定义了一个带有float参数函数指针。所以我们在使用自定义Schedule的时候,回调函数一定要记得带上一个float参数,它记录了两次执行的间隔。如果忘了,可是会出现类型转换错误的异常。这种方式在callfunc_selector,menu_selector等也以同样的方式出现。
5.谁来调用回调函数但是有没有发现,如果这个回调函数是个全局函数或者static函数也就算了,偏偏它是个成员函数,成员函数需要实例来调用,可是从调用方法来看,好像没传入调用对象?[cpp] view plaincopythis-&schedule(schedule_selector(HelloWorld::log),1,3,2);
是的,还记得一开头说的CCNode内部封装的m_pScheduler吗?[cpp] view plaincopyCCScheduler *m_pS
原来CCNode帮我们实现了:[cpp] view plaincopyvoidCCNode::schedule(SEL_SCHEDULE selector, floatinterval, unsigned intrepeat, floatdelay) { CCAssert( selector, &Argument mustbe non-nil&); CCAssert( interval &=0, &Argumentmust be positive&); m_pScheduler-&scheduleSelector(selector,this,interval , repeat, delay, !m_bRunning); }
原来this这个时候被传入了,同时传入的参数还有m_bRunning,m_bRunning表示节点是否在运行中(是否在舞台上),OnEnter的时候赋值true,OnExit的时候赋值false,所以在执行定时器的时候还必须确保节点有在运行。
这样确实用起来怪怪的,所以在cocos2d-x v3.0版本中,参数和函数指针用一个宏打包起来了~
至于CCSchedule内部是怎么实现的,以及CCTimer的触发回调,有兴趣的就自己看看源码吧
帖子地址:&分享给好友
千锋教育专注iOS、Android移动互联网研发培训,坚持“用良心做教育”为理念。业内唯一一家敢推出“一个月免费试听,不满意不缴费”政策。拿万元高薪,下一个就是你,详情请咨询网址:
注册账号后积极发帖的会员
经常参与各类话题的讨论,发帖内容较有主见
经常帮助其他会员答疑
经常在论坛发帖,且发帖量较大
长期对论坛的繁荣而不断努力,或多次提出建设性意见
社区QQ达人
使用QQ帐号登录论坛的用户
生肖为鼠的会员通过申请获得
邹星,一个十足的90后女生,千锋深圳校区iOS1502期的学员,目前就职于深圳支付界科技有限公司,薪资12K。在一个接着一个offer向她砸过来的时候,我相信很多同学都是羡慕的,没想到这么瘦小的女生居然在职场上这么吃香。
就业榜数据统计:
6月份就业374人;
平均月薪9103元;
应届生61人;
应届生平均月薪9587元;
8000元以上283人;
iOS开发工程师平均月薪9227元;
Android开发工程师平均月薪8832元;
随着移动互联网迅猛发展的态势,HTML5开发工程师成为一份被重视的新兴职业,市场人才紧缺,就业薪资高,是这个新兴职业所呈现的特点。千锋作为移动互联网研发培训机构,一直专注于iOS开发、Android开发培训,拥有基础理论与项目实战的科学课程体系,时刻紧随移动互联网最前沿技术,并与各行业企业有着密切合作关系,为移动互联网业培养输送了众多的精英人才。
#千锋早安心语# “ 不要羡慕别人比你成熟。那是因为,一路走来,他们遇见的坏人比你多~ ”早安~~~
千锋教育官方认证微博,欢迎关注
5月19日,千锋教育发布“扣丁学堂”IT教育在线学习平台,打造互联网精品移动开发课程,实现在线教育与线下教育的交互结合,引领真正的教育O2O。
Powered bycocos2dx视频教程《动画管理类》培训-高清观看-腾讯视频
cocos2dx视频教程《动画管理类》培训
上传者其它视频
扫描二维码随身看视频
用手机或平板摄像头拍下右侧的二维码,您可以:
1 在手机或平板上继续观看该视频
2 分享给你的微信好友或者朋友圈
视频上传者
上传视频数109
好莱坞影院推荐
赤道交易超级武器
人工智能机械婊攻心计
下载手机APP帮忙一下,水知道eclipse怎么配置cocos2d-x的环境,最好有教学过程?_百度知道
帮忙一下,水知道eclipse怎么配置cocos2d-x的环境,最好有教学过程?
求各位帮帮忙,游戏开发的话,而且还想在此请教各位,应学习些什么,需要什么软件来编程(最好能推荐一下)?本人想自学游戏开发,但不知道软件怎么搞的
您的回答被采纳后将获得:
系统奖励20(财富值+经验值)+难题奖励10(财富值+经验值)+提问者悬赏5(财富值+经验值)
我有更好的答案
/link://wenku://wenku.baidu.baidu?url=BwjEUOn4QTosFCgY-WzimNLTUT2lypBu721z3wHZVwH1sdjROAj6OxHj4gyOtUNMeG17eV0VwwWJalx9dnvRQ5koOWGE_B3sY_l7lVoRhRS" target="_blank">http你好建议参考这篇文章<a href="http
其他类似问题
为您推荐:
cocos2d的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁【Cocos2d-Js基础教学(2)类的使用和面向对象】 - zisou阿杰 - 博客园
类的使用和面向对象
大家都知道在cocos2d-x 底层是C++编写的,那么就有类的概念和继承机制。
但是在JS中,是没有类这个概念的,没有提供类,没有C++的类继承机制。
那么JS是通过什么方式实现简单的继承呢?JS是通过对象的原型实现继承。
我们来看一下这段代码:
var baselayer = cc.Layer.extend({
ctor:function(){
this._super();
cc.log("baselayer ctor read");
init:function(){
this._super();
cc.log("baselayer init read");
我们申明了baseLayer对象 ,并且利用cc.Layer.extend,继承了CClayer。
那么问题来了?他究竟是怎么实现的呢?我们按住crtl跟进去看看cc.Layer.extend的实现;
<pileSuper.ClassManager = ClassM
/* Managed JavaScript Inheritance
* Based on John Resig's Simple JavaScript Inheritance http://ejohn.org/blog/simple-javascript-inheritance/
* MIT Licensed.
* 在这里申明了,实现JS继承的方式 是参考了 John Resig's
的一个例子来实现的;并且有原文地址,有兴趣的同学可以去看看原版实现方式
(function () {
var fnTest = /\b_super\b/;
var config = cc.game.
var releaseMode = config[cc.game.CONFIG_KEY.classReleaseMode];
if(releaseMode) {
console.log("release Mode");
* The base Class implementation (does nothing)
cc.Class = function () {
* Create a new Class that inherits from this Class
* @param {object} props
* @return {function}
cc.Class.extend = function (props) {
//声明_super对象,并赋值为原型
var _super = this.
// Instantiate a base Class (but only create the instance,
// don't run the init constructor)
//实例化创建prototype这个基类,只是创建实例,并没有跑init构造函数
var prototype = Object.create(_super);
//给这个class复制ID标识,并且将_super对象添加到ClassManager类管理器中
var classId = ClassManager.getNewID();
ClassManager[classId] = _
// Copy the properties over onto the new prototype. We make function
// properties non-eumerable as this makes typeof === 'function' check
// unneccessary in the for...in loop used 1) for generating Class()
// 2) for cc.clone and perhaps more. It is also required to make
// these function properties cacheable in Carakan.
//进行函数的验证检测,以及设置他使用基本设置
var desc = { writable: true, enumerable: false, configurable: true };
//单例模式的基础申明
prototype.__instanceId = null;
// The dummy Class constructor
//创建Class这个类
function Class() {
this.__instanceId = ClassManager.getNewInstanceId();
// All construction is actually done in the init method
//如果这个类他存在.ctor方法,那么就默认的使用执行这个方法
//ctor在JS中就相当于构造函数
if (this.ctor)
this.ctor.apply(this, arguments);
//给ID复制
Class.id = classId;
// desc = { writable: true, enumerable: false, configurable: true,
value: XXX }; Again, we make this non-enumerable.
desc.value = classId;
Object.defineProperty(prototype, '__pid', desc);
// Populate our constructed prototype object
//把我们原型对象赋值
Class.prototype =
// Enforce the constructor to be what we expect
//将整个类赋值给desc.value
desc.value = C
//并且将类里构造的对象赋值
Object.defineProperty(Class.prototype, 'constructor', desc);
// Copy getter/setter
//模拟get/set的方式,使用cc.clone函数来拷贝
this.__getters__ && (Class.__getters__ = cc.clone(this.__getters__));
this.__setters__ && (Class.__setters__ = cc.clone(this.__setters__));
for(var idx = 0, li = arguments. idx & ++idx) {
var prop = arguments[idx];
for (var name in prop) {
var isFunc = (typeof prop[name] === "function");
var override = (typeof _super[name] === "function");
var hasSuperCall = fnTest.test(prop[name]);
if (releaseMode && isFunc && override && hasSuperCall) {
desc.value = pileSuper(prop[name], name, classId);
Object.defineProperty(prototype, name, desc);
} else if (isFunc && override && hasSuperCall) {
desc.value = (function (name, fn) {
return function () {
var tmp = this._
// Add a new ._super() method that is the same method
// but on the super-Class
//如果在新的对象方法里面添加._super(),他会继承父类的_super方法
//并且实现方法里面的所有对象及方法的赋值
this._super = _super[name];
// The method only need to be bound temporarily, so we
// remove it when we're done executing
var ret = fn.apply(this, arguments);
this._super =
})(name, prop[name]);
Object.defineProperty(prototype, name, desc);
} else if (isFunc) {
desc.value = prop[name];
Object.defineProperty(prototype, name, desc);
prototype[name] = prop[name];
if (isFunc) {
// Override registered getter/setter
//如果是方法,那么重载里面的属性,并且实现get,set方法可以直接使用
var getter, setter, propertyN
if (this.__getters__ && this.__getters__[name]) {
propertyName = this.__getters__[name];
for (var i in this.__setters__) {
if (this.__setters__[i] === propertyName) {
cc.defineGetterSetter(prototype, propertyName, prop[name], prop[setter] ? prop[setter] : prototype[setter], name, setter);
if (this.__setters__ && this.__setters__[name]) {
propertyName = this.__setters__[name];
for (var i in this.__getters__) {
if (this.__getters__[i] === propertyName) {
cc.defineGetterSetter(prototype, propertyName, prop[getter] ? prop[getter] : prototype[getter], prop[name], getter, name);
// And make this Class extendable
// 可以使用Class.extend来实现类的继承
Class.extend = cc.Class.
//add implementation method
//添加要实现的方法
Class.implement = function (prop) {
for (var name in prop) {
prototype[name] = prop[name];
重点看3个点:
// The dummy Class constructor
//创建Class这个类
function Class() {
this.__instanceId = ClassManager.getNewInstanceId();
// All construction is actually done in the init method
//如果这个类他存在.ctor方法,那么就默认的使用执行这个方法
//ctor在JS中就相当于构造函数
if (this.ctor)
this.ctor.apply(this, arguments);
第一,这个是在JS中的实现构造函数的方法,如果在自定义类中,存在有ctor:function()这个方法,那么他会
默认执行,默认成为构造函数;
desc.value = (function (name, fn) {
return function () {
var tmp = this._
// Add a new ._super() method that is the same method
// but on the super-Class
//如果在新的对象方法里面添加._super(),他会继承父类的_super方法
//并且实现方法里面的所有对象及方法的赋值
this._super = _super[name];
// The method only need to be bound temporarily, so we
// remove it when we're done executing
var ret = fn.apply(this, arguments);
this._super =
})(name, prop[name]);
第二,desc.value在这个for循环中的赋值,实现了this._super()的原理,它会为派生类实完成对父类的实现;
通俗点来说,就是,如果我们想要继承并实现父类的方法,那么就需要在方法里面调用this._super()这个方法!
// And make this Class extendable
// 可以使用Class.extend来实现类的继承
Class.extend = cc.Class.
第三,讲cc.Class.extend赋值给Class.extend,就可以使用Class.extend来实现自定义类的继承;
OK,梳理完毕下面看看我们来学习一下怎么实现自定义类和自定义的继承:
var myLayer = baselayer.extend({
ctor:function(){
this._super();
cc.log("myLayer ctor read");
init:function(){
this._super();
cc.log("myLayer init read");
这段代码中我从myLayer继承了父类baselayer,注意用法就是刚才我们Review底层代码时看到的
var myLayer = baselayer.extend({});
然后继续续实现ctor构造方法函数,和自定义方法函数init;
并且日志输出一下;
最终我们需要在MainScene中调用;
var MainScene = cc.Scene.extend({
onEnter:function(){
this._super();
var layer = new myLayer();
this.addChild(layer);
我们首先只调用
var layer = new myLayer();
看看最终输出是什么?
从输出可以看出他先调用了baselayer,再调用了myLayer;
那么就可以理解为我们直接new myLayer() 会直接自动实现调用我们写的ctor构造函数方法;
而且是先调用父类,然后再调用我们的派生类自定义类;
他并没有主动调用init:function()这个方法,因为他是我们自定义的,所以需要我们手动去调用
layer.init();
OK,我们加上手动调用后再来看一下输出是什么?
我们可以看到了前两行输出都是 ctor 先执行;
init 函数后执行;
而且调用也是 先执行baseLayer 我们的父类的init函数 再执行我们的自定义init方法!
现在就非常清晰了,我们的myLayer.init方法继承了baseLayer.init的属性方法;
而且实现的原理就是通过this._super()来实现的!
我们再修改一下代码来看看是不是这样,将myLayer类里面的init方法里面的this._super();这句话去掉!
看看我们的baseLayer.init方法会不会被调用
var myLayer = baselayer.extend({
ctor:function(){
this._super();
cc.log("myLayer ctor read");
init:function(){
cc.log("myLayer init read");
看看输出:
&从输出看出,并没有执行baseLayer 的init方法函数,那么也就验证了this._super();的作用;
this._super()调用实现了对父类的继承,包括父类相同名方法里面的参数的继承;
这段很精辟的代码就大概介绍了 在cocos2dx-Js中如何实现类,和类的继承的概念;
有了面向对象的编程概念后我们以后在cocos2dx-Js中,实现更复杂的逻辑实现和功能实现就变得非常容易了!
本教程结束;
本教程视地址频在:
想通过视频学习本教程的童鞋可以进入九秒课堂观看本章节视频;千锋为广大开发爱好者推出免费视频教程,包含了C语言、OC语言、iOS开发教程、Java语言、Android开发教程、Swift语言、HTML5开发、游戏开发、实战项目等众多权威视频教程,由iOS开发培训教学先驱者欧阳老师、中国Android教学引领者Mars老师、最具影响力的老罗老师,被百度评为最佳C语言教程的潘老师等千锋众多实力派讲师倾情奉献。视频讨论请到千锋教育论坛专题论坛提问。
千锋教育QQ交流群
——我们是一群热爱移动开发的人
如果你也是
未来科技公开课《钢铁侠诞生的小秘密》
BUG终结者公开课《程序崩溃信息跟踪及性能分析》
授课讲师:
适用对象:
视频简介:
Swift开发视频教程《Swift语言学习》
Swift开发视频教程《Swift快速进行iOS开发》
iOS开发视频教程《C语言基础》
授课讲师:
适用对象:
视频简介:
iOS开发视频教程《OC语言基础》
iOS开发视频教程《UI-第1季》
iOS开发视频教程《愤怒的小鸟》
授课讲师:
适用对象:
视频简介:
Android应用开发视频教程《第1季》
Android应用开发视频教程《第2季》
Android应用开发视频教程《第3季》
授课讲师:
适用对象:
视频简介:
Android游戏开发视频教程
Android应用开发视频教程《Java语言》
Android游戏开发视频教程《数独》
授课讲师:
适用对象:
视频简介:
《HTML5+CSS3基础》
授课讲师:
适用对象:
视频简介:
扣丁学堂iOS开发视频课程
扣丁学堂Android开发视频课程
扣丁学堂Cocos2d-x开发视频课程
授课讲师:
适用对象:
视频简介:
千锋教育微信号扫描加好友
北京天丰利校区:北京市海淀区宝盛北里西区28号天丰利商城4层
咨询电话:400-654-
北京沙河校区:北京市昌平区沙阳路18号北京科技职业技术学院广场服务楼2层、南区服务楼2层
深圳科技园校区:广东省深圳市南山区高新技术产业园R3栋B5楼
咨询电话:400-648--801
深圳大学城校区:深圳市南山区留仙大道1201号大学城创客小镇16栋3楼 咨询电话:400-648--801
上海学院地址:上海市宝山区同济支路199号智慧七立方3楼3层
咨询电话:400-654-
郑州学院地址:郑州市金水区纬五路21号河南教育学院综合楼6楼、7楼 咨询电话:0 7
广州学院地址:广州市天河区元岗路310号智汇park创意园E座5层
咨询电话:400-654-19207
大连学院地址:大连市高新园区软件园路18号软件园9号楼105室
咨询电话:400-654-026086
武汉学院地址:武汉市东新区光谷大道77号金融港B26栋9楼
咨询电话:400-654-
成都学院地址:成都市一环路西二段17号四川旅游学院青羊校区内
咨询电话:028--
西安学院地址:西安市二环南路西段60号永安大厦4层
咨询电话:400-654-
京ICP备号-3 京公网安备55号

我要回帖

更多关于 cocos studio视频教程 的文章

 

随机推荐