小怪物重制计划第五天

时间:2021-07-30 20:44:58

昨天收到了offer,所以基本一整天都在研究公司的情况,也决定了之后的短期职业发展规划。

因为之后的项目是用虚幻三开发的3D游戏项目,所以应该可以借此计划熟悉3D知识,转向3D方向。正好仙剑系列应该也是用这个引擎,可以积累很多经验啦。

未来的2015年,一定要不停步的努力加油!

昨天跑通了html5版,原来是因为缺少了几个文件,game-boot-js.js文件调用了cocos2d自带的jsloader,然后它又调用了main.js文件,这个默认为项目正式的入口,然后从这个文件里开始加载项目资源,调用入口函数。

在这里要完成第一天的内容,尝试完成绑定c++文件到js的全过程。

这里挑选了一个常见的接口 sendMessageToast,一步一步往下找,发现它来自Config.cpp,而config文件也只是提供一个中转,接下来调用的是jni.cpp。在jni.cpp这里需要区别安卓和iOS,分别调用底层接口。iOS方面,调用的是CSystemInfoMgr.h中的接口,顾名思义,这里包含了一些获取设备信息的接口。


CSystemInfoMgr中,涉及了不少比较复杂的C++用法,这里一点点的进行分析。

头文件中,USING_NS_CC表示using namespace cocos2d。

接下来是一个比较复杂的类型定义:

typedef void (cocos2d::CCObject::*SEL_DataHandler)(void *);

#define schedule_data_selector(_SELECTOR) (SEL_DataHandler)(&_SELECTOR)


第一行定义的是一个函数指针,还涉及到typedef和define的运用。顺便把C++巩固一下哈。

这里首先涉及一个函数指针的概念。函数指针意味着这个对象是一个指针,它指向一个函数,通常的格式为: int (* 变量名)(参数)。

如果用 * 变量名 = 函数名,这样的方式来置换的话,就比较好理解了。

扩展一下,指针函数的概念是,一个函数的返回值是一个指针,写作 int *变量名(参数)。其实看起来就是少了一对括号的区别。

然后是typedef,我的理解就是typedef是一个专门定义类型的宏定义。

然而这个cocos2d::CCObject::*SEL_DataHandler的意义我不是很理解,这个单独解释的话,应该是一个指向cocos2d::CCObject类型的指针,但是后面的意思又意味着它指向一个返回值为空参数为空的函数。

查了一些文章,发现这个问题已经有很多人研究过啦,这个就是cocos2d的回调模式,现在想起大学的时候学这些复杂的函数调用总觉得没什么意思,感觉不至于会用到这么难的用法,现在才发现是自己没有接触到真正复杂的领域,不过这些其实也是皮毛吧。

开始分析,刚才我以为cocos2d::CCObject::是一个类型定义,但其实它是一个成员函数的标志,意味着SEL_DataHandler指向的这个函数是cocos2d::CCObject的成员函数。

去掉指针的话就很好理解了 void cocos2d::CCObject::function();

意思就是这个指针必须被这个类生成的对象所调用。

关于第二行的宏定义,一开始我的理解有误区,以为是一个函数调用的宏定义,所以百思不得其解,后来看了别人的用法之后发现,这个替换是强制类型转换的意思,目的是把括号内的函数地址转换为前面定义的那个函数指针类型。

这样赋值给一个成员指针变量之后,就可以调用了。


不过虽然分析了半天,但这个用法目前我们暂时用不到,先看下面的代码吧。