Lua脚本和C++交互(四)

上一篇中,你已经可以在Lua里面用C++的函数了,那么咱们再增加一点难度,比如,我有一个CTest对象,要作为一个参数,传输给func_Add()执行,怎么办?
很简单,如果你对上面的代码仔细阅读,你会发现下面的代码一样简洁。为了支持刚才要说的需求,我们需要把Sample.lua再做一点修改。

function func_Add(x, y, f)
  -- New了一个CTest对象,并进行赋值操作,最后把结果打印在屏幕上

  -- local test = CTest:new()
  -- test:SetData("I‘m xiaotian")
  -- test:GetData()  

  f:SetData("I‘m xiaotian")
  f:GetData() 

  return x..y;
end 

假设就是我们要传入的CTest对象。我们要在Lua里面使用它。(我们的CLuaFn都不用改,把main函数稍微改一下即可,来看看怎么写。)

#include "CLuaFn.h"
int main(int argc, char* argv[])
{
    CLuaFn CLuaFn;
    CLuaFn.Init();
    CLuaFn.InitClass();
    CLuaFn.LoadLuaFile("Sample.lua");
    CParamGroup ParamIn;
    CParamGroup ParamOut;
    char szData1[20] = {‘\0‘};

    sprintf(szData1, "[yang]");
    _ParamData* pParam1 = new _ParamData(szData1, "string", (int)strlen(szData1));
    ParamIn.Push(pParam1);  

    char szData2[20] = {‘\0‘};
    sprintf(szData2, "[xiaotian]");
    _ParamData* pParam2 = new _ParamData(szData2, "string", (int)strlen(szData2));
    ParamIn.Push(pParam2);  

    //只追加了这里
    CTest* pTest = new CTest();
    _ParamData* pParam3 = new _ParamData(pTest, "CTest", sizeof(CTest));
    ParamIn.Push(pParam3);
    //追加结束
  
    char szData4[40] = {‘\0‘};
    _ParamData* pParam4 = new _ParamData(szData4, "string", 40);
    ParamOut.Push(pParam4);

    CLuaFn.CallFileFn("func_Add", ParamIn, ParamOut);
    char* pData = (char* )ParamOut.GetParam(0)->GetParam();
    printf("[Main]Sum = %s.\n", pData);
    getchar();
    return 0;
}

运行看看输出结果:

既然已经到了这里,我们索性再加点难度,如果我要把CTest作为一个对象返回回来怎么做?很简单,且看。(运行中断,问题待解决)

#include "CLuaFn.h"
int main(int argc, char* argv[])
{
    CLuaFn CLuaFn;
    CLuaFn.Init();
    CLuaFn.InitClass();
    CLuaFn.LoadLuaFile("Sample.lua");
    CParamGroup ParamIn;
    CParamGroup ParamOut;
    char szData1[20] = {‘\0‘};

    sprintf(szData1, "[yang]");
    _ParamData* pParam1 = new _ParamData(szData1, "string", (int)strlen(szData1));
    ParamIn.Push(pParam1);  

    char szData2[20] = {‘\0‘};
    sprintf(szData2, "[xiaotian]");
    _ParamData* pParam2 = new _ParamData(szData2, "string", (int)strlen(szData2));
    ParamIn.Push(pParam2);  

    //只追加了这里
    CTest* pTest = new CTest();
    _ParamData* pParam3 = new _ParamData(pTest, "CTest", sizeof(CTest));
    ParamIn.Push(pParam3);
    //追加结束 

    //char szData4[40] = {‘\0‘};
    //_ParamData* pParam4 = new _ParamData(szData4, "string", 40);
    CTest* pTestRsult = NULL;
    _ParamData* pParam4 = new _ParamData(pTestRsult, "CTest", sizeof(CTest));
    ParamOut.Push(pParam4);

    CLuaFn.CallFileFn("func_Add", ParamIn, ParamOut);  

    //char* pData = (char* )ParamOut.GetParam(0)->GetParam();
    //printf("[Main]Sum = %s.\n", pData);  

    //接受Lua返回参数为CTest类型,并调用其中的方法
    pTestRsult = (CTest* )ParamOut.GetParam(0)->GetParam();
    pTestRsult->GetData(); 

    getchar();
    return 0;
}
时间: 2024-08-09 22:02:48

Lua脚本和C++交互(四)的相关文章

Lua脚本和C++交互(一)

现在,越来越多的C++服务器和客户端融入了脚本的支持,尤其在网游领域,脚本语言已经渗透到了方方面面,比如你可以在你的客户端增加一个脚本,这个脚本将会帮你在界面上显示新的数据,亦或帮你完成某些任务,亦或帮你查看别的玩家或者NPC的状态...如此等等. 但是我觉得,其实脚本语言与C++的结合,远远比你在游戏中看到的特效要来的迅猛.它可以运用到方方面面的领域,比如你最常见的应用领域.比如,你可以用文本编辑器,写一个脚本语言,然后用你的程序加载一下,就会产生出很绚丽的界面.亦或一两句文本语言,就会让你的

Lua脚本和C++交互(三)

前两篇文章中介绍了C++调用lua.lua栈操作的一些相关知识. 下面说一下Lua的工具.我们下一步要用到其中的一个帮助我们的开发,其实,Lua里面有很多简化开发的工具,你可以去www.sourceforge.net去找一下.它们能够帮助你简化C++对象与Lua对象互转之间的代码.这里说几个有名的,当然可能不全. (lua tinker)如果你的系统在windows下,而且不考虑移植,那么我强烈推荐你去下载一个叫做lua tinker的小工具,整个工具非常简单,一个.h和一个.cpp.直接就可以

Lua脚本和C++交互(二)

上一节讲了一些基本的Lua应用,下面,我要强调一下,Lua的栈的一些概念,因为这个确实很重要,你会经常用到.熟练使用Lua,最重要的就是要时刻知道什么时候栈里面的数据是什么顺序,都是什么.如果你能熟练知道这些,实际你已经是Lua运用的高手了.当你初始化一个栈的时候,它的栈底是1,而栈顶相对位置是-1,说形象一些,你可以把栈想象成一个环,有一个指针标记当前位置,如果-1,就是当前栈顶,如果是-2就是当前栈顶前面一个参数的位置.以此类推.当然,你也可以正序去取,这里要注意,对于Lua的很多API,下

Win32下 Qt与Lua交互使用(四):在Lua脚本中自由执行Qt类中的函数

话接上篇.通过前几篇博客,我们实现在Lua脚本中执行Qt类中函数的方法,以及在Lua脚本中连接Qt对象的信号与槽. 但是,我们也能发现,如果希望在Lua脚本中执行Qt类的函数,就必须绑定一个真正实现功能的函数.如QWidget::show(),需要写一个在栈中取出widget指针,widget调用show()函数的方式.如果希望在Lua中调用大量函数,就需要编写大量的C++实现函数.有没有什么省时省力的好方法呢? 上一篇中我们实现了在Lua脚本中连接信号与槽.我们只是传过去了两个QObject的

Win32下 Qt与Lua交互使用(二):在Lua脚本中使用Qt类

话接上篇.成功配置好Qt+Lua+toLua后,我们可以实现在Lua脚本中使用各个Qt的类.直接看代码吧. #include "include/lua.hpp" #include <QWidget> #include <QApplication> #include <QFile> #include <QDebug> static int tolua_new_QWidget(lua_State* pState) { QWidget* wid

Win32下 Qt与Lua交互使用(三):在Lua脚本中connect Qt 对象

话接上文.笔者为了方便使用Lua,自己编写了一个Lua的类.主要代码如下: QLua.h 1 #ifndef QLUA_H 2 #define QLUA_H 3 4 // own 5 #include "include/lua.hpp" 6 7 // qt 8 #include <QObject> 9 #include <QFile> 10 #include <QDebug> 11 12 #include <QWidget> 13 #in

Redis进阶应用:Redis+Lua脚本实现复合操作

一.引言 Redis是高性能的key-value数据库,在很大程度克服了memcached这类key/value存储的不足,在部分场景下,是对关系数据库的良好补充.得益于超高性能和丰富的数据结构,Redis已成为当前架构设计中的首选key-value存储系统. 虽然Redis官网上提供了200多个命令,但做程序设计时还是避免不了为了实现一小步业务逻辑而多次调用Redis的情况. 以compare and set场景为例.如果使用Redis原生命令,需要从Redis中获取这个key,然后提取其中的

《Redis设计与实现》学习笔记-Lua脚本

Redis从2.6开始支持Lua脚本,和事务的功能类似,可以通过Lua脚本原子的执行多个Redis命令.Redis提供了EVAL和EVALSHA命令执行lua脚本. 创建并修改Lua坏境 Redis在服务器内嵌了一个Lua坏境,并进行了一系列的修改,从而确保这个Lua坏境可以满足Redis服务器的需要,通过下列步骤创建并修改Lua坏境: 创建一个基础Lua坏境,通过调用Lua的C API函数lua_open. 载入多个函数库到Lua坏境中,让Lua脚本可以使用这些函数来进行数据操作.包括Lua核

第二十三篇:在SOUI中使用LUA脚本开发界面

像写网页一样做客户端界面可能是很多客户端开发的理想. 做好一个可以实现和用户交互的动态网页应该包含两个部分:使用html做网页的布局,使用脚本如vbscript,javascript做用户交互的逻辑.当需求变化时,只需要在服务端把相关代码调整一下,用户即可看到新的内容(界面). 传统的客户端程序开发流程和网页开发可能完全不同. 首先是界面的布局,在老式的界面布局过程中,程序员先在界面上放好各种控件,然后需要自己通过相应的代码来维护界面在不同状态下控件的显示状态及位置.当界面中元素很多时,单纯布局