Posts

【Programming In Lua (2E) 笔记】4:用lua扩展C++——C++调用lua函数

31 May 2016

自从13年开始做手游接触lua,始终是边写边学,缺乏对lua更加全面系统的学习,这几篇文章开始“重识lua”, 把欠下的帐还回来。这个系列侧重于总结lua作为扩展程序的用法,不会着重介绍lua的语法。

前言

本文介绍如何在C++中调用lua的function,lua很多情况下是被用做一种扩展语言,它的function更是增加了这门扩展语言的灵活性,赋予了lua生命力,使它变化莫测。在lua的function中还可以回调宿主语言的函数。这篇文章展示如何从C++端调用lua函数,相反的过程在后面的文章再做介绍。 本文使用的Lua版本还是5.1。

简单的调用示例

还是使用上一篇文章中使用的环境,调用config.lua里面的f函数: res/config.lua:
function f(var)
    return var * var + 2 * var + 100
end
...

阅读全文 ...


【重识Lua】3:给C++程序插上翅膀——C++调用lua

30 May 2016

自从13年开始做手游接触lua,始终是边写边学,缺乏对lua更加全面系统的学习,这几篇文章开始“重识lua”, 把欠下的帐还回来。这个系列侧重于总结lua作为扩展程序的用法,不会着重介绍lua的语法。

前言

前一篇文章总结了lua中C API的基本用法和常见的虚拟栈操作函数,并没有涉及到具体的lua代码,只有当这些API用来连接lua代码和C++代码的时候,才能发挥出它的最大威力。本文的主题在于使用C++来加载、调用lua代码。 本文使用的Lua版本还是5.1。

C++中加载lua脚本

就像打开其它类型的文件一样,比如打开一个txt文件读取成一个字符串,打开一个json文件用json解析库来解析出感兴趣的字段;对于lua脚本则有lua解析器去解释它,它不仅可以被当做普通的静态配置文件来使用,更牛的地方就在于,它,是可编程的!对,因为它是一门编程语言。尤其是当你为lua打开了它的翅膀(lua标准库)。 下面就给出一个简单的例子,演示一下,如何把lua脚本当做一种资源,载入到C++代码中。 下面这个lua文件里定义了两个全局变量一个是字符串类型的怪物类型,一个是怪物血量,我把它当做一个配置文件来用,在C++中读取它们的值 res/config.lua:
monster_type = "Ghost"
blood        = 99.9
main.cpp:
#include "lua_51/lua.hpp"
#include "include/inc.h"
#include <string>

using namespace elloop;
using namespace std;

int main() {

    string scriptName("res/config.lua");

    lua_State* lua = luaL_newstate();

    int luaError = luaL_loadfile(lua, scriptName.c_str());  // 加载lua文件
    if (luaError) {
        error(lua, "fail to load script: %s, %s", scriptName.c_str(), lua_tostring(lua, -1));
    }

    luaError = lua_pcall(lua, 0, 0, 0);     // 执行这个lua文件, 三个0依次表示:输入0个参数,返回0个结果,需要0个错误处理函数
    if (luaError) {
        error(lua, "fail to run script: %s", lua_tostring(lua, -1));
    }

    lua_getglobal(lua, "blood");                            // 获取全局变量blood
    lua_getglobal(lua, "monster_type");                     // 获取全局变量monster_type

    double blood     = lua_tonumber(lua, 1);                // 读取两个全局变量
    const char* type = lua_tostring(lua, 2);

    psln(blood);                                            // 打印 blood = 99.9
    psln(type);                                             // type = Ghost

    lua_close(lua);

    return 0;
}
...

阅读全文 ...


【重识Lua】2:操作lua栈

29 May 2016

自从13年开始做手游接触lua,始终是边写边学,缺乏对lua更加全面系统的学习,这几篇文章开始“重识lua”, 把欠下的帐还回来。这个系列侧重于总结lua作为扩展程序的用法,不会着重介绍lua的语法。

前言

本文总结了Lua中操作虚拟栈的API,通过这些API可以做到在Lua和C/C++之间传递数据,相互调用对方。在Programming In Lua那本书中(后文简称PIL),作者把这些API称作“C API”,一方面是因为他们是用C语言实现,另一方面它们的作用是用来实现C/C++语言和Lua之间的相互调用。正如PIL中说的那样,几乎所有的这些API都会操作虚拟栈,这个虚拟栈在C/C++与Lua通信过程中,解决了两者之间存在的两个差异,第一是内存管理方式的差异:Lua的垃圾回收和C语言的手动管理;第二是数据类型方面的差异:Lua是动态类型和C语言的静态类型。 本文使用的Lua版本还是5.1。

Lua C API 版Hello World

下面这段代码演示了C API的基本用法,向lua虚拟栈中push了一个字符串,然后从栈中读取这个字符串,将其打印出来:
extern "C" {
   #include "lua_51/lua.h"                            // C API函数声明所在的文件
   #include "lua_51/lauxlib.h"                        // luaL_ 开头的函数所在的头文件, 比如luaL_newstate
}

#include <iostream>

int main()
{
    lua_State* lua = luaL_newstate();                  // 创建一个lua state

    lua_pushstring(lua, "hello world");                // 入栈一个字符串
    std::cout << lua_tostring(lua, 1) << std::endl;    // 从栈中读取字符串

    lua_close(lua);                                    // 关闭lua state

    return 0;
}
...

阅读全文 ...


【重识Lua】1:从源码安装lua

18 May 2016

自从13年开始做手游接触lua,始终是边写边学,缺乏对lua更加全面系统的学习,这几篇文章开始“重识lua”, 把欠下的帐还回来。这个系列侧重于总结lua作为扩展程序的用法,不会着重介绍lua的语法。

前言

本文以lua-5.1为例,说明如何从源代码生成二进制的lua和luac可执行文件。PC操作系统以Mac为例。

下载lua源代码

这里是:lua官网各个版本的下载地址 下载Lua 5.1

编译出lua和luac

解压下载的lua-5.1.tar.gz压缩包, 得到如下的目录结构:
  /Users/sunyongjian1/codes/lua/lua-5.1 l
total 56
drwxr-xr-x@ 12 lina  staff   408B  2 20  2006 .
drwxr-xr-x   5 lina  staff   170B  5 18 22:46 ..
-rw-r--r--@  1 lina  staff   1.5K  1  7  2006 COPYRIGHT
-rw-r--r--@  1 lina  staff   7.7K  2 20  2006 HISTORY
-rw-r--r--@  1 lina  staff   3.7K  1 26  2006 INSTALL
-rw-r--r--@  1 lina  staff   2.2K  2 20  2006 MANIFEST
-rw-r--r--@  1 lina  staff   3.5K  2 16  2006 Makefile
-rw-r--r--@  1 lina  staff   1.3K  1 19  2006 README
drwxr-xr-x@ 11 lina  staff   374B  2 13  2006 doc
drwxr-xr-x@ 12 lina  staff   408B  2  9  2006 etc
drwxr-xr-x@ 58 lina  staff   1.9K  5 18 23:10 src
drwxr-xr-x@ 22 lina  staff   748B  8 12  2005 test
...

阅读全文 ...


【离开有爱】

05 May 2016

今天确定了离职日期:5月16号,因为下周就不在公司了,所以提前办理了离职手续。 com4loves 有爱有梦的地方,感谢这里的伙伴们。 ...

阅读全文 ...