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

版权声明:本文博客原创文章。博客,未经同意,不得转载。

时间: 2024-12-08 13:59:51

Cocos2d-x3.0下一个 Lua与C++打电话给对方的相关文章

JS 如何获取当前上一个月、下一个月和月份所含天数

在数据报表查询中,经常需要设置查询的日期区间,如查询2018-02-01至2018-02-28的整月数据,这时需要提供快捷整月查询按钮: 如: 一般日期年月日之间由"-"或者"/"等符合分割开,简单判断当前月份进行处理即可.另外,如何获取所选月份的最大天数是关键,这里可以借助js自带Date函数来处理,关键在于定位到所选月份的最后一天 关键代码如下: function changeMonth(type) { //获取当前输入框内的日期 var s_date = $(

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#

如何在Cocos2D 1.0 中掩饰一个精灵(六)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 掩饰一个精灵:实现代码 打开HelloWorldLayer.m并且在init方法上方添加如下方法: - (CCSprite *)maskedSpriteWithSprite:(CCSprite *)textureSprite maskSprite:(CCSprite *)maskSprite { // 1 CCRenderTexture * rt = [CCRe

18.n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, 每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。 当一个数字删除后,从被删除数字的下一个继续删除第m个数字。 求出在这个圆圈中剩下的最后一个数字。

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4263868.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, 每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字). 当一个数字

Cocos2d-x3.0下实现循环列表

本文的实现是參照我之前在做iOS时实现的一个能够循环的列表这里用C++重写一遍. 效果: 原文地址:http://blog.csdn.net/qqmcy/article/details/27393011 用法:能够使用创建project时的HelloWorld測试 ,h文件里加入循环列表的监听回调 void djInfiniteScroll(Ref* sender); .cpp #include "DJInfiniteScrollPicker.h" DJInfiniteScrollPi

cocos2d-x 2.2.0 怎样在lua中注冊回调函数给C++

cocos2d-x内部使用tolua进行lua绑定.可是引擎并没有提供一个通用的接口让我们能够把一个lua函数注冊给C++层面的回调事件. 翻看引擎的lua绑定代码,我们能够仿照引擎中的方法来做. 值得吐槽的是.这套流程在开发中差点儿是不可避免的,而cocos2d-x居然不把它作为一个公用接口暴露给开发人员,而须要我自己动手,真是无奈. 以下以一个简单的消息分发类为样例,演示怎样完毕这一工作. MessageDispatcher.h class MessageDispather { public

QUHD TV量子点电视显示行业的下一个风口?

从学生视听时代的卡带机到CD再到VCD和DVD,从显示时代的CRT到液晶再到如今的4K的超高清.科技的迭代改变着生活方式同样也颠覆着整个行业的创新和生存方式.就电视行业而言,从热炒的3D开始,科技不断为消费者提供更为难以想象的体验方式,那么,量子点科技的热潮能否成为电视行业的真正风口? 众行业专家力赞量子点 国际顶尖纳米材料科学家.国家千人计划入选者彭笑刚认为,量子点是人类至今发现的最好发光材料,其保障发光颜色可以颠覆从蓝光到红光的整个可见区,而且色纯度高.连续可调.并且量子点已经开始应用于生物

lintcode 中等题:next permutation下一个排列

题目 下一个排列 给定一个整数数组来表示排列,找出其之后的一个排列. 样例 给出排列[1,3,2,3],其下一个排列是[1,3,3,2] 给出排列[4,3,2,1],其下一个排列是[1,2,3,4] 注意 排列中可能包含重复的整数 解题 和上一题求上一个排列应该很类似 1.对这个数,先从右到左找到递增序列的前一个位置,peakInd 2.若peakInd = -1 这个数直接逆序就是答案了 3.peakInd>= 0 peakInd这个位置的所,和 peakInd 到nums.size() -1