【COCOS2DX-LUA 脚本开发之十一】C/C++与Lua之间进行数据函数交互以及解决“PANIC: unprotected error in call to Lua API (attempt t

本文介绍了在Cocos2d-x中如何进行C/C++与Lua之间的数据和函数交互,包括luaL_dofile、lua_settop等关键Lua API的使用,并提供了一个名为HclcData的封装类,支持全局变量、Table和函数的调用。同时,文章分析了在交互过程中可能出现的“PANIC: unprotected error in call to Lua API”错误及其两种可能原因:文件路径错误和局部函数调用问题。
摘要由CSDN通过智能技术生成

本站文章均为 李华明Himi 原创,转载务必在明显处注明:(作者新浪微博: @李华明Himi 
转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/lua1/1343.html
 

          ☞ 点击订阅 ☜
 本博客最新动态!及时将最新博文通知您!


                 
width="150" height="210" frameborder="0" scrolling="no" src="http://widget.weibo.com/relationship/bulkfollow.php?language=zh_cn&uids=1916000601&wide=1&color=FFFFFF,FFFFFF,0082CB,666666&showtitle=0&showinfo=1&sense=0&verified=1&count=1&refer=http%3A%2F%2Fwww.himigame.com%2Flua1%2F1343.html&dpc=1" style="border-width: 0px; margin: 0px; padding: 0px; font-family: arial, helvetica, clean, sans-serif; font-size: 12px; line-height: 16px; text-align: left; ">

在使用Cocos2d-x 时候,难免需要C/C++调用Lua函数、数据或Lua调用C/C++函数,那么本篇讲详细介绍C/C++与Lua之间的数据、函数交互。

首先让我们来简单了解几个Lua API函数:

int   luaL_dofile (lua_State *L, const char *filename)  :

加载并运行指定文件,没有错误返回0

void  lua_settop (lua_State *L, int index):

参数允许传入任何可接受的索引以及 0 。 它将把堆栈的栈顶设为这个索引。 如果新的栈顶比原来的大,超出部分的新元素将被填为 nil 。 如果 index 为 0 ,把栈上所有元素移除。

void   lua_getglobal (lua_State *L, const char *name):

把全局变量 name 里的值压入堆栈。

void   lua_pop (lua_State *L, int n):

从堆栈中弹出 n 个元素。相当于清除!

void   lua_pushstring (lua_State *L, const char *s):

把指针 s 指向的以零结尾的字符串压栈。 Lua 对这个字符串做一次内存拷贝(或是复用一个拷贝), 因此 s 处的内存在函数返回后,可以释放掉或是重用于其它用途。 字符串中不能包含有零字符;第一个碰到的零字符会认为是字符串的结束。

更多的API请参考:http://www.codingnow.com/2000/download/lua_manual.html

了解了以上几个函数,为了方便童鞋们使用,Himi直接贴出封装好的类 HclcData,其中主要包括如下几个功能:

1. C/C++ 调用 Lua 全局变量

2. C/C++ 调用 Lua 全局Table 某元素

3. C/C++ 调用 Lua 全局Table

4. C/C++ 调用 Lua 函数

5. Lua 调用C/C++ 函数

 

下面直接贴出代码:HclcData.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//
//  HclcData.h
//  CppLua
//
//  Created by Himi on 13-4-17.
//
//
 
#ifndef __CppLua__HclcData__
#define __CppLua__HclcData__
 
#include "cocos2d.h"
using namespace cocos2d;
using namespace std;
 
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
};
 
class HclcData{
public:
    static HclcData* sharedHD();
 
        //------------  c++ -> lua ------------//
 
    /*
        getLuaVarString : 调用lua全局string
 
        luaFileName  = lua文件名
        varName = 所要取Lua中的变量名
     */
    const char* getLuaVarString(const char* luaFileName,const char* varName);
 
    /*
     getLuaVarOneOfTable : 调用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变量名
 
     (注:返回的是所有的数据,童鞋们可以自己使用Map等处理)
     */
    const char* getLuaVarTable(const char* luaFileName,const char* varName);
 
    /*
     callLuaFunction : 调用lua函数
 
     
  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值