tolua框架学习(二)

      这里是从tolua的案例开始学习的。

      tolua的第一的案例就是Hello World。代码很简单。tolua的使用分为三步:

      1、实例化一个lua虚拟机,这里就是new一个LuaState对象,通过Start()方法启动虚拟机。启动方法,设置了一系列的属性值。这里的LuaState就相当于LuaInterface中的Lua类,只不过要复杂很多。

      2、使用DoString方法执行lua代码片段

      3、对lua虚拟机栈的判空,具体对应的就是CheckTop方法。

      4、析构虚拟机

这是一个简单的使用tolua框架的过程。

      第二个案例是讲解的DoFile方法和Require方法的异同。这两个方法都是执行的同一个lua文件,执行结果也是一样的。唯一的不同点在于加载lua脚本是,使用的路径(名字),如下图:

如下图:

DoFile方法加了“.lua”后缀,Require方法则没有加。而且,DoFile()方法可以反复执行,但是,Require方法只能执行一次。

       DoFile方法在加载文件的时候,有一步FildFile()的方法,该方法会检测参数是否是以“.lua”结尾的,然后去掉后缀,最终会尝试将获取到的文件名添加进一个完整的路径中判断该路径是否存在,存在则返回该路径。路径如下:

路径如下:

会循环这个7个路径,用截取后缀的文件名替换其中的“?”,来获取完整的路径。找到路径后,通过File.ReadAllBytes()读取文件流。值得注意的是,DoFlie方法中有一步LuaChunkName()方法,该方法会在文件名(去掉后缀的)前面添加一个@符号。LuaLoadBuffer方法是真正读取lua文件内容的方法。通过单步调试,跟踪到了ToLua脚本下的Print()方法,该方法接受一个IntPtr对象,这个方法会循环lua脚本中的每一行进行判断,并且执行。在本例中,是输出了两句string,所以跳转到了LuaDLL中的lua_ptrtostring中,由该方法获取了打印的内容。通过测试发现,Print()方法会将输出结果针对string,nil,bool,之类,进行分别的处理,其在循环中做了一系列的判断。值得注意的是,lua中的方法的执行,在单步调试中是没有体现出来的。但是结果依旧会获取到。

其在循环中做了一些列的判断。

      Require()方法的参数是不需要加后缀的。调用LuaRequire()后,会调用ToLua脚本中的Loader()方法。其也是通过File.ReadAllBytes()读取文件,这一点和DoFile方法是一致的。Loader方法返回1。其后直接调用Print方法,这里都是一致的。控制不能重复调用的地方在于LuaRequire()方法。第一次调用的时候,会返Loader()方法,其后就不再调用Loader()方法了。直接返回。

猜你喜欢

转载自blog.csdn.net/Tong1993222/article/details/83154685