欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

lua学习历程(2)

程序员文章站 2024-03-17 23:32:46
...
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的错误信息。

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