lua学习历程(2)

Lua环境由所有可操作的数据构成,入编译好的函数,变量以及其他运行时内存,这些数据保存在一个称为lua_State的结构中。Lua环境是用来发送和接受数据的地方,它利用栈Lua Stack来达成目的,lua Stack只能通过Lua的API来访问。
C++代码和Lua的交互是双向的。
我们可以从Lua脚本中调用c++函数的接口,而这些接口被称为LuaGlue函数,因为它们可以在Lua环境中整合C++的功能,是读取c++数据,调用c++函数的主要工具。
LuaGlue函数的优点:
当需要调用c++函数时,就通过LuaGlue来完成操作。我们可以先用lua来编写需要的函数,当发现性能瓶颈的时候再换成c++实现,因为程序的调用几乎是一样的。
cLua类有获取LuaGlue函数的参数方法。cLua::GETStringArgument方法返回指向空值终止字符串的指针或者NULL表示参数错误。cLua::GetNumberArgument方法返回双精度浮点数或者0.0表示没有参数。两个方法都有一个参数来指定要获取的参数位置,从1开始,表示第一个参数。
cLua::PushString函数或者cLua::PushNumber函数可以向Lua栈中存入返回值。
最好定义一个局部变量来保存参数的个数,并初始化为1(Lua都是从1开始的),另外建议每次都返回相同个数的返回值,不够要用默认值来代替,为了避免出现nil值的错误。

创建lua运行环境
lua_State *pLuaState=lua_open();
luaopen_base(pLuaState);
lua_iolibopen(pLuaState);
lua_strlibopen(pLuaState);
lua_mathlibopen(pLuaState);
lua_dblibopen(pLuaState);

创建一个文档,里面记录着所有的LuaGlue函数以及它们的参数信息,甚至还包括在每个项目中的实例。这个文档将会成为脚本程序员非常重要的参考工具。
用事件驱动的方式可以让c++程序和Lua脚本环境交互。
处理错误的方式:在Lua中捕抓它们,然后再抛出c++异常,异常处理程序会打开一个标准的对话框输出Lua提供的消息然后再关闭程序。从C调用Lua时,采用了一种“受保护的调用”的方式。Lua不再用它正常的错误处理系统,而是返回错误代码和字符串给主调函数。当lua返回错误的时候,会创建CError对象,返回的错误字符串会追加上错误发生地点的相关信息。主程序包含在一个大的try……catch程序块中,在catch中会调用CError Report方法(显示对话框),然后结束程序。

RegisterEvent函数告诉GUI系统事件处理Lua函数的名字并启动事件流。

StartGUI.lua文件是GUI脚本系统的入口,用它来定义包含GUI_KEY_PRESS事件代码变量。

与GUI系统相关的LuaGlue函数
RunGUI(“interface.lua”)
RunGUI()函数执行传入的Lua代码文件,指示GUI系统创建一个新的界面,或者重新启动之前的界面。这个界面会变成当前界面。这个Lua文件应当通过LuaGlue函数RegisterEvent定义并注册事件处理程序。
RegisterEvent(“eventFunction”)
RegisterEvent()函数告诉GUI系统调用相应函数来响应当前界面发出的GUI事件

Shell程序的扩展
通过继承的方式进行扩展,例如CBase:Init
所有添加到MyGlue数组的函数都会在Lua中自动注册。

调试窗口
主程序通过实例化CWinConsole对象创建调试窗口,只有使用常用的Lua文本才能直接把调试程序链接到主程序,使用CWinConsole方法在窗口中插入文本和print LuaGlue函数的实现,在窗口的底部有一个输入控件,剩下的部分用来显示Lua和c++程序的消息。输入区域检测到键按下时候,就会向窗口发送输入命令,输出区域就会显示Lua或者主程序向对象传递的消息,它不会产生c++异常,只会单纯地输出lua的错误信息。

注册表通过键值的方式来保存不同的数据。

猜你喜欢

转载自blog.csdn.net/qq842447820/article/details/82056410
今日推荐