假设读者已经有了c++基础,懂一点lua,用lua写过一点脚本,最好还拿他和c++作了一些简单的交互,接下来,但愿读者还能了解过一些面向对象的思想。c++
先引出问题:编程
用c++和lua完成交互,并让lua能够模块化的功能调用, app
c++ 和lua 交互,这时lua属于脚本语言, 解释性语言。明确lua的做用,使用lua来实现模块化的功能,完成业务层的功能,而此时c++ 为底层各类功能进行封装而且开放接口。模块化
若是只是简简单单的交互,无非是c++的函数导出,lua调用的时候把函数名注册进来的时候c++能够用根据传进来的函数名进行动态调用本身的函数,这个是初步模型。函数
这里咱们讨论怎么模块化的导出到lua,让lua更加简便的来作业务层的功能,lua
1.首先若是咱们懂mfc的话先梳理下mfc的思路,win32是一个消息循环大概是下面这个样子的: 一个window的窗口回调函数,而后根据参数 把消息ID分别进行处理,若是不懂win32编程不要紧,这里有篇文章,(这个不看也不要紧),http://blog.csdn.net/hyman_c/article/details/53447695,mfc的思想就是 使用map吧每个消息id和函数对象进行关联,而后吧全部窗口的对象经过继承的时候把函数放入一个树或者列表中,而后在最后一个回调函数中分别调用,没有这个经验,不懂不要紧。可是到这应该听到了一个思想,map把对应的ID和函数对象自己进行了绑定。.net
2.接下来咱们看一个例子, love2d中是怎么作的:对象
其中box2d,sdlwindow,画图功能(opengl),以及其余功能了。 这些模块其实就是c++模块。blog
而后咱们以其中一个模块来举例,看下c++是怎么作的,以love.graphics模块,即opengl画图的模块:继承
love.graphics这里的画画提供了lua的绘图相关接口。
c++层分为两个:Graphics的封装(模型层),提供最基本的封装,很是接近lua要使用的接口,而后wrap_Graphics这里是lua要调用c++真正要调用到的类,这个类,是lua真正要调用的类,没错就是这里。
这里wrap_Graphics是这样实现,分别在之前的接口中从新实现了一套函数,借着Graphics的基层,而后根据实际lua的须要,以及调用方式的改变,进行封装,以后提供了一个map,他把全部的函数名字和函数对象分别放入map中,具体注册的时候,只要提供模块名,c++遍历那个函数map,便把全部的函数注册进入lua了。 下面是这个wrap_graphics中 的函数map
把这个存入函数列表的map做为wrappedModule的成员变量。
-------------后面还要更新,前面写的啰里啰嗦,却没写多少东西哦。这是我我的看到代码后根据我说想到的,来写到这篇博客的,喜欢的支持下