您的位置:首页 > 编程语言 > Lua

VC和LUA混合开发之VC程序调用Lua脚本函数

2015-11-15 17:50 519 查看
Lua语言以其卓越的可扩展性、简单、高效率和与平台无关性在游戏领域得到广泛应用。今天花了一些时间学习VC和Lua如何混合开发,编写了一个小例程,和大家分享一下这方面的经验。

首先在http://www.lua.org/ftp/ 下载Lua的最新版本:lua-5.1.4。然后用VS C++ 2005 + sp1建一个Win32静态库空工程:lua,把相关c文件和h文件都添加进来。为了导出了lua的api接口,注意添加一个预处理宏:LUA_CORE(或者是LUA_LIB也可以),另外运行时库采用多线程DLL。

首先编写一个Lua脚本函数,代码如下:

[python] view
plaincopy

function add ( x, y )

return x + y;

end

将这个代码保存为add.lua。

接着我们新建一个MFC对话框工程:Calc。这个程序实现简单整数加法运算。

首先在对话框类定义一个Lua虚拟机指针以及加法运算所需要的变量:

[cpp] view
plaincopy

/**

* /brief LUA 虚拟机指针。

*/

lua_State *m_plua;

/**

* /brief 加法运算的左操作数。

*/

int m_nLeftNum;

/**

* /brief 加法运算的左操作数。

*/

int m_nRightNum;

/**

* /brief 加法运算的结果。

*/

long m_nResult;

在对话框初始化函数CCalcDlg::OnInitDialog调用LUA虚拟机初始化函数InitLuaState。InitLuaState函数的代码如下:

[cpp] view
plaincopy

/*!

* /brief 初始化Lua虚拟机。

*

* /return 无。

*/

void CCalcDlg::InitLuaState()

{

m_plua = lua_open();

if(NULL!=m_plua)

{

luaopen_base(m_plua);

luaopen_table(m_plua);

luaopen_string(m_plua);

luaopen_math(m_plua);

luaopen_debug(m_plua);

}

}

在对话框的销毁消息响应函数里关闭Lua虚拟机:

[cpp] view
plaincopy

void CCalcDlg::OnDestroy()

{

CDialog::OnDestroy();

// TODO: 在此处添加消息处理程序代码

lua_close (m_plua);

}

在执行加法按钮的消息函数里添加如下代码:

[cpp] view
plaincopy

void CCalcDlg::OnBnClickedOk()

{

// TODO: 在此添加控件通知处理程序代码

UpdateData(TRUE);

StackDump(m_plua);

string strLuaFile = _T("");

GetLuaFile(strLuaFile); // 得到lua脚本文件全路径

luaL_dofile(m_plua,strLuaFile.c_str()); // 解释分析lua文件

StackDump(m_plua);

lua_getglobal(m_plua,_T("add")); // 取到一个全局标号add,取的同时会把add函数压栈

StackDump(m_plua);

lua_pushnumber(m_plua,m_nLeftNum); // 把第一个参数压入栈里

StackDump(m_plua);

lua_pushnumber(m_plua,m_nRightNum); // 第二个参数压栈

StackDump(m_plua);

if(lua_pcall(m_plua,2,1,0)!= 0) // 执行add函数

{

AfxMessageBox(_T("调用lua脚本函数失败"));

return;

}

StackDump(m_plua);

m_nResult = (int)lua_tonumber(m_plua, -1); // 函数执行完了,执行结果被压栈,所以取得最顶端的一个数就是结果值,-1就是指取栈顶的值

StackDump(m_plua);

lua_pop(m_plua,1); // 把值从栈里清除,pop(弹出)一个值

StackDump(m_plua);

UpdateData(FALSE);

}

编译环境为:WinXp + sp3, VS C++2005 + sp1,程序运行界面如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: