如何在cocos2d-x中回调函数
这篇文章给大家分享的是在cocos2d-x中回调函数的方法,相信大部分人都还没学会这个技能,为了让大家学会,给大家总结了以下内容,话不多说,一起往下看吧。
代码一
//callback.cpp:定义控制台应用程序的入口点。 // #include"stdafx.h" classCCObject{ }; typedefvoid(CCObject::*SEL_CallFunc)();//定义一个CCObject不带任何实参的函数指针SEL_CallFunc #definecallfunc_selector(_SELECTOR)(SEL_CallFunc)(&_SELECTOR)//仅仅是一个宏 classTest{ public: voidfunc(); }; voidTest::func() { printf("test->func"); } int_tmain(intargc,_TCHAR*argv[]) { //创建一个Test对象,暂时没用到 Test*test=newTest(); //声明定义了一个类型为SEL_CallFunc的函数指针f,然后用f指针指向Test::func函数 SEL_CallFuncf=callfunc_selector(Test::func); //上面一句替换宏后等价于SEL_CallFuncf=SEL_CallFunc)(&Test::func); //创建一个CCObject对象 CCObject*obj=newCCObject(); //调用执行Test::func函数 (obj->*f)(); getchar(); deletetest; deleteobj; return0; }
运行结果:
结果分析:
1.我们有一个CCObject类
2.我们可以通过这种方法typedef void (CCObject::*SEL_CallFunc)();来定义一个CCObject类的函数指针类型 SEL_CallFunc
3.我们定义了一个SEL_CallFunc的指针变量f
4.假定我们有一个类Test,里面有个函数func(),它的返回值和实参都与SEL_CallFunc一致,那么我们可以通过如下方法去调用这个函数.
SEL_CallFunc f = callfunc_selector(Test::func);
CCObject* obj = new CCObject();
(obj->*f)();
总之我觉得这看起来有点诡异- - 反正记住能这么干就好了
代码二:
为了凸显新增加的代码,之前的注释就删掉了。
//callback.cpp:定义控制台应用程序的入口点。 // #include"stdafx.h" classCCObject{ }; typedefvoid(CCObject::*SEL_CallFunc)(); #definecallfunc_selector(_SELECTOR)(SEL_CallFunc)(&_SELECTOR) classTest{ public: intvalue;//增加公开的成员变量value public: voidfunc(); }; voidTest::func() { printf("test->funcvalue:%d",value);//打印value } int_tmain(intargc,_TCHAR*argv[]) { Test*test=newTest(); test->value=100;//赋值100 SEL_CallFuncf=callfunc_selector(Test::func); CCObject*obj=newCCObject(); (obj->*f)(); getchar(); deletetest; deleteobj; return0; }
运行结果:
结果分析:
我在Test类里增加了成员变量value,并且给它赋值100,同时在func函数里把它打印出来。与代码一一样的方法来调用func函数,怎么说呢,value打印出来的值不是100而是-33686272,说明它不知道把哪块内存空间里的值给打印出来了。这跟我预想的应该是一样的,毕竟我们从头到尾都没有用到过test这个对象- -如果能打印出100那就更怪异了。那怎么才能打印出test里的成员呢,按逻辑,那一定跟Test类的具体对象有关系。代码三给出方案。
代码三
//callback.cpp:定义控制台应用程序的入口点。 // #include"stdafx.h" classCCObject{ }; typedefvoid(CCObject::*SEL_CallFunc)(); #definecallfunc_selector(_SELECTOR)(SEL_CallFunc)(&_SELECTOR) classTest:publicCCObject{//继承与CCObject public: intvalue; public: voidfunc(); }; voidTest::func() { printf("test->funcvalue:%d",value); } int_tmain(intargc,_TCHAR*argv[]) { Test*test=newTest(); test->value=100; SEL_CallFuncf=callfunc_selector(Test::func); //CCObject*obj=newCCObject(); (test->*f)();//采用test对象去调用 getchar(); deletetest; //deleteobj; return0; }
结果:
结果分析:
好了,成功打印出了value。
1.让Test继承CCObject
2.不再用CCObject的一个对象obj去调用f而是改成Test的一个对象test去调用f
PS:如果采用以下方法去调用也是可以打印出value
CCObject* obj = test;
(obj->*f)();
PS:cocos2d-x的类都是继承与CCObject
关于在cocos2d-x中回调函数的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。