使用LuaPlus在C++项目中集成Lua脚本

2024-01-07 11:08

本文主要是介绍使用LuaPlus在C++项目中集成Lua脚本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用LuaPlus在C++项目中集成Lua脚本
2008-07-16 00:02

    花了两天时间,费了好大的功夫才实现了C++项目中集成Lua脚本的可行性分析。下面的工作就是去写脚本了,在写脚本之前先把C++集成Lua的经验总结一下。

     目前能实现C++集成Lua的有很多。比较常见的有LuaPlus,LuaBind,ToLua++,LuaWrapper等。这几种我都试过了,各有优缺点。

    LuaBind,确实不错,很强大。如果不是它需要Boost库支持的话我就选它了。

    ToLua++,我只是粗略的看了下,因为编译太麻烦,很快就放弃了。不过看网上评价还不错。

    LuaWrapper,国内前辈所出,本想支持一下,可一看说明还是需要Boost,只好放弃了。

并不是因为Boost不好,而是因为我的项目连带工程源代码都要投递去应聘的,不能保证对方机器上也安装了Boost库。

    最后还是选择了LuaPlus,感觉还可以,下面是使用经验总结。

1。创建一个State。

   LuaStateOwner* pState = NULL;
   pState = new LuaStateOwner(true);
   if ( !pState )
    return E_OUTOFMEMORY;

注意:LuaStateOwner构造函数参数true表示在构造的过程中对Lua标准库进行初始化。这一点非常重要。一开始我调用的不带参数的构造函数,然后在.lua中调用math.random()的时侯就一直失败,今天研究了一下午才弄明白的。

2. 注册C++函数到Lua
   (这一点我没试,直接引用示例里的)

static int PrintLSNumber(LuaState* state)
{
     LuaStack args(state);

    
// Verify it is a number and print it.
    if (args[1].IsNumber()) {
         printf(
"%f ", args[1].GetNumber());
     }

    
// No return values.
    return 0;
}

   LuaObject globalsObj = (*pState)->GetGlobals();
   globalsObj.Register("PrintNumber", PrintLSNumber);

3。注册C++类成员函数到Lua

   LuaObject globalsObj = (*pState)->GetGlobals();
   CTest test; //CTest为类名
   globalsObj.RegisterDirect( "update", test, &CTest::Update );

Update为CTest的一个成员函数,

双引号中的update是指注册到Lua中的函数名,在lua脚本中使用update()即调用了test对象的Update()函数。

4.从文件中载入并执行脚本

   int iret = (*pState)->DoFile( "test.lua" );
   if ( 0 != iret )
    return false;
返回值为0表示成功,否则不成功.

5.C++获取Lua脚本中的变量

   float x = (*pState)->GetGlobal( "x" ).GetFloat();
   注意,要在DoFile之后才能从lua中获取变量,此时文件已被载入。

6.C++中调用脚本里的函数

      LuaFunction<bool> RandBuild = (*pState)->GetGlobal("RandBuild");
     bool ret = RandBuild();

     test.lua文件中:

     function RandBuild()
           math.random(); --第一次的随机数太小,合弃
          x = math.random( -100, 100 );
         return true;
     end;

7.Lua脚本中调用C++函数

    这里可以调用的就是前面注册过的C++函数,调用时直接使用注册时的函数名。
    比如第3步中的,如果脚本中写update(),就相当于在C++中test.Update();

8.C++中直接调用注册的Lua函数

    (*pState)->DoString( "update()" );
    这一句意思是只执行"update()"这一句脚本。

另外,项目目录下还要放上LuaPlus和Lua的头文件,还有LuaPlus的.lib和.dll。这些可以在LuaPlus网站上下载到。http://luaplus.org/tiki-index.php?page=LuaPlus+Home+Page
草草的写完,有点乱,就将就着看吧。


类别:脚本语言 | 添加到搜藏 | 浏览( 435) | 评论 (0) <script language="javascript"> /* 
'); if(pre[0]){ document.write('上一篇:'); } /*]]>*/ </script>
上一篇:
vector函数表    下一篇: Lua中的随机数

这篇关于使用LuaPlus在C++项目中集成Lua脚本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/579710

相关文章

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔