Cocos2d-x3.0下 Lua与C++相互调用

这里讲下Lua与C++之间如何实现相互调用

原文连接:http://blog.csdn.net/qqmcy/article/details/26052771

DJLCData.h 实现类

//
//  DJLCData.h
//  uitestLua
//
//  Created by 杜甲 on 14-5-17.
//
//

#ifndef __uitestLua__DJLCData__
#define __uitestLua__DJLCData__

#include "cocos2d.h"
#include "CCLuaEngine.h"

USING_NS_CC;

using namespace std;

extern "C"{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

}

class DJLCData {

public:
    static DJLCData* getInstance();

    /*
        getLuaVarString:调用Lua全局string
        luaFilename = lua文件名
     varName = 所要取Lua中的变量名

     */

    const char* getLuaVarString(const char* luaFileName,const char* varName);

    /*
     *  @brief getLuaOneOfTable:调用Lua全局table中的一个元素
                luaFileName = lua文件名
                varName = 所要取Lua中的table变量名
                keyName = 所要取Lua中的table中某一个元素的Key
     */

    const char* getLuaVarOneOfTable(const char* luaFileName,const char* varName,const char* keyName);

    /*
     *  getLuaVarTable:调用lua全局table
        luaFileName = lua文件名
        varName = 所要取的table变量名
        (注:返回的是所有的数据)
     */

    const char* getLuaVarTable(const char* luaFileName,const char* varName);

    /*
        callLuaFunction:调用lua函数
        luaFileName = lua文件名
        functionName = 所要调用Lua中的函数名

     */

    const char* callLuaFunction(const char* luaFileName,const char* functionName);

    /***************** lua ->     C++       **************/
    void callCppFunction(const char* luaFileName);

private:
    static int cppFunction(lua_State* ls);
    static bool _isFirst;
    static DJLCData* _shared;
    const char* getFileFullPath(const char* fileName);

};

#endif /* defined(__uitestLua__DJLCData__) */

DJLCData.cpp

//
//  DJLCData.cpp
//  uitestLua
//
//  Created by 杜甲 on 14-5-17.
//
//

#include "DJLCData.h"
bool DJLCData::_isFirst;
DJLCData* DJLCData::_shared;
DJLCData* DJLCData::getInstance()
{
    if (_shared == nullptr) {
        _shared = new DJLCData();
    }
    return _shared;
}

const char* DJLCData::getLuaVarString(const char *luaFileName, const char *varName)
{
    lua_State* ls = LuaEngine::getInstance()->getLuaStack()->getLuaState();
    int isOpen = luaL_dofile(ls, getFileFullPath(luaFileName));

    if (isOpen != 0) {
        log("Open Lua Error:%i",isOpen);
        return nullptr;
    }

    lua_settop(ls, 0);
    lua_getglobal(ls, varName);
    int statesCode = lua_isstring(ls, 1);
    if (statesCode != 1) {
        log("Open Lua Error : %i",statesCode);
        return nullptr;
    }
    const char* str = lua_tostring(ls, 1);
    lua_pop(ls, 1);
    return str;

}
const char* DJLCData::getLuaVarOneOfTable(const char *luaFileName, const char *varName, const char *keyName)
{
    lua_State* ls = LuaEngine::getInstance()->getLuaStack()->getLuaState();
    int isOpen = luaL_dofile(ls, getFileFullPath(luaFileName));
    if (isOpen != 0) {
        log("Open Lua Error : %i",isOpen);
        return nullptr;
    }

    lua_getglobal(ls, varName);
    int statesCode lua_istable(ls, -1);
    if (statesCode != 1) {
        log("Open Lua Error: %i",statesCode);
        return nullptr;
    }

    lua_pushstring(ls, keyName);
    lua_gettable(ls, -2);
    const char* valueString = lua_tostring(ls, -1);
    lua_pop(ls, -1);
    return valueString;
}

const char* DJLCData::getLuaVarTable(const char *luaFileName, const char *varName)
{
    lua_State* ls = LuaEngine::getInstance()->getLuaStack()->getLuaState();
    int isOpen = luaL_dofile(ls, getFileFullPath(luaFileName));

    if (isOpen != 0) {
        log("Open Lua Error:%i",isOpen);
        return nullptr;
    }

    lua_getglobal(ls, varName);
    int it = lua_gettop(ls);
    lua_pushnil(ls);

    string result = "";

    while (lua_next(ls, it)) {
        string key  = lua_tostring(ls, -2);
        string value = lua_tostring(ls, -1);
        result = result + key + ":" + value + "\t";
        lua_pop(ls, 1);
    }
    lua_pop(ls, 1);
    return result.c_str();

}

const char* DJLCData::callLuaFunction(const char *luaFileName, const char *functionName)
{
    lua_State* ls = LuaEngine::getInstance()->getLuaStack()->getLuaState();
    int isOpen = luaL_dofile(ls, getFileFullPath(luaFileName));

    if (isOpen) {
        log("Open Lua Error:%i",isOpen);
        return nullptr;

    }

    lua_getglobal(ls, functionName);
    lua_pushstring(ls, "shen");
    lua_pushnumber(ls, 23);
    lua_pushboolean(ls, true);

    /*
        lua_call
     第一个参数:函数的参数个数
     第二个参数:函数返回值个数
     */

    lua_call(ls, 3, 1);
    const char* iResult = lua_tostring(ls, -1);
    return iResult;

}

void DJLCData::callCppFunction(const char *luaFileName)
{
    lua_State* ls = LuaEngine::getInstance()->getLuaStack()->getLuaState();

    /*
        Lua调用的C++的函数必须是静态的
     */

    lua_register(ls, "cppFunction", cppFunction);
    int isOpen = luaL_dofile(ls, getFileFullPath(luaFileName));
    if (isOpen != 0) {
        log("Open Lua Error:%i",isOpen);
        return;
    }

}

int DJLCData::cppFunction(lua_State *ls)
{
    int luaNum  = (int)lua_tonumber(ls, 1);
    char* luaStr = (char*)lua_tostring(ls, 2);
    log("Lua调用cpp函数时传来的两个参数:%i,%s",luaNum,luaStr);
    /*
        返给Lua的值
     */
    lua_pushnumber(ls, 321);
    lua_pushstring(ls, "shenqi");

    /*
        返给Lua值个数
     */
    return 2;

}

const char* DJLCData::getFileFullPath(const char *fileName)
{
    //src//  这里的//是指我的lua文件放在src这个目录下
    std::string str =  StringUtils::format("src//%s",fileName);

    return FileUtils::getInstance()->fullPathForFilename(str).c_str();
}

hello2.lua

function myadd(x, y)
    return x + y
end

luaStr = "shenqi"

luaTable = {name = "xiaonan",age = "20"}

function luaLogString(_logStr,_logNum,_logBool)

    print("Lua 脚本打印从C传来的字符串:",_logStr,_logNum,_logBool)
    return "Call Lua function OK"
end

function call_cpp(_logStr,_logNum,_logBool)
    num,str = cppFunction(999,"lua string")
    print("从cpp函数中获得两个返回值:",num,str)
end

调用方法:

 log("%s",DJLCData::getInstance()->getLuaVarString("hello2.lua", "luaStr"));
        log("%s",DJLCData::getInstance()->getLuaVarOneOfTable("hello2.lua", "luaTable", "name"));

        log("Table = %s",DJLCData::getInstance()->getLuaVarTable("hello2.lua", "luaTable"));

        log("Call Lua Function Back :%s",DJLCData::getInstance()->callLuaFunction("hello2.lua", "luaLogString"));

        DJLCData::getInstance()->callCppFunction("hello2.lua");
        DJLCData::getInstance()->callLuaFunction("hello2.lua", "call_cpp");
cocos2d: shenqi
cocos2d: xiaonan
cocos2d: Table = name:xiaonan	age:20
cocos2d: [LUA-print] Lua 脚本打印从C传来的字符串:	shen	23	true
cocos2d: Call Lua Function Back :Call Lua function OK
cocos2d: Lua调用cpp函数时传来的两个参数:999,lua string
cocos2d: [LUA-print] 从cpp函数中获得两个返回值:	321	shenqi

Cocos2d-x3.0下 Lua与C++相互调用

时间: 2024-10-20 14:41:16

Cocos2d-x3.0下 Lua与C++相互调用的相关文章

lua编程之lua与C相互调用

lua是扩展性非常良好的语言,虽然核心非常精简,但是用户可以依靠lua库来实现大部分工作.除此之外,lua还可以通过与C函数相互调用来扩展程序功能.在C中嵌入lua脚本既可以让用户在不重新编译代码的情况下修改lua代码更新程序,也可以给用户提供一个自由定制的接口,这种方法遵循了机制与策略分离的原则.在lua中调用C函数可以提高程序的运行效率.lua与C的相互调用在工程中相当实用,本文就来讲解lua与C相互调用的方法. Lua与C相互调用的首要问题是如何交换数据,lua API使用了一个抽象的栈与

菜鸟入门之lua与c++相互调用(包含多个demo)

前两篇文章中,已经介绍了使用vs2010编译lua5.1源码生成lua.lib 和 vs项目中使用c++调用lua,可以保证demo在vs上运行起来了.这里再详细介绍下c++和lua之间的相互调用以及原理. c++与lua直接的调用,实际上通过一个栈结构来传递数据,该栈结构栈顶的索引值为-1,向栈底方向索引值依次为-1 ,-2......栈顶索引为1.栈结构里可以放函数,表,字符串,整形等各种lua的基本数据. 一.在当前cpp目录下创建test.lua文件,用于与c++交互调用,代码如下: p

lua和C++相互调用

从lua调用C++函数和对象,利用LuaPlus可以方便的从C++中调用lua脚本,反过也一样.通过注册函数或类对象,lua便可以访问C++. 一.C风格函数注册    Lua提供了C风格的回调函数注册,该函数原型如下: int Callback(LuaState* state); 无论是全局函数.类非虚函数.类虚函数,只要符合上面的原型,都可以向Lua注册.我们以全局函数为例,下面是我们提供的一个回调函数CStyleAddFunc: int CStyleAddFunc(LuaState * s

Lua与C++相互调用

{--1.环境--} 为了快速入手,使用了小巧快速的vc++6.0编译器 以及在官网下载了Lua安装包..官网地址{--http://10.21.210.18/seeyon/index.jsp--} 两者都安装好后,即可进行 {--2.工程以及配置--} 1.首先用vc++6.0创建一个简单的win32 console application 2.从Lua的安装目录下复制include和lib两个目录下的文件到刚刚创建的工程的目录下. {include:包含了lua的.h头文件} {lib:包含

uLua学习笔记(三):Unity3D和Lua之间的相互调用

这篇笔记主要集中学习一下uLua和Unity3D之间相互调用的方法,我们导入了uLua之后,现在会弹出一个类似学习屏幕的东西,如下: 先赞一个! Unity3D调用Lua Unity3D调用Lua的方法还是比较简单的,所以先说这个,由于这部分在学习笔记(一)中已经说的挺多的了,更多的内容点击这里回去看,所以这里我们就来看一个简单的示例即可: 1 using LuaInterface; 2 using UnityEngine; 3 4 public class UnityCallLua : Mon

C#与lua相互调用

Lua是一种很好的扩展性语言,Lua解释器被设计成一个很容易嵌入到宿主程序的库.LuaInterface则用于实现Lua和CLR的混合编程. (一)C#调用Lua 测试环境:在VS2015中建一个C#控制台应用程序,并添加LuaInterface.dll的引用 LuaInterface下载地址:http://luaforge.net/projects/luainterface/ (下载luainterface-1.5.3,这里面的资源比较多) LuaInterface.Lua类是CLR访问Lua

Cocos2d-x3.0下一个 Lua与C++打电话给对方

这里谈下Lua与C++如何实现相互通话 原来的连接:http://blog.csdn.net/qqmcy/article/details/26052771 DJLCData.h 实现类 // // DJLCData.h // uitestLua // // Created by 杜甲 on 14-5-17. // // #ifndef __uitestLua__DJLCData__ #define __uitestLua__DJLCData__ #include "cocos2d.h"

cocos2d 2.x在opengl es 2.0 下自定义着色器来创建特别酷的特效(译)

cocos2d 2.x在opengl es 2.0 下自定义着色器来创建特别酷的特效(译) (2012-12-24 13:22:17) 转载▼ 标签: it cocos2d opengl 着色器 渲染 翻译:弹涂鱼 PS:欢迎加入开发群:285275050 本文翻译自:http://www.raywenderlich.com/10862/how-to-create-cool-effects-with-custom-shaders-in-opengl-es-2-0-and-cocos2d-2-x#

C程序与Lua脚本相互调用

Lua脚本是一种可用于C程序开发/测试的工具,本篇介绍一下C程序与Lua脚本如何进行相互调用,更加详细的操作参见<Programing in Lua>.本文分为3个部分:1.Windows环境下Lua的下载以及安装注意事项:2.Visual C++6.0中Lua的配置:3.C程序与Lua脚本相互调用实例. 1.Windows环境下Lua的下载以及安装注意事项 a.下载Lua for Windows,笔者用的版本是V5.1.4-35: b.上微软官网,下载Visual C++运行库——vcred