学习 在cocos2d-x中使用LUA

2015年03月18日 10:32 0 点赞 0 评论 更新于 2025-11-21 17:35

在本篇文章中,我们将详细介绍如何在 Cocos2d-x 中使用 Lua 脚本语言,涵盖了 Lua 脚本引擎的注册、字符串和文件的执行、全局方法和带参方法的调用,以及在 Lua 中调用 C++ 全局方法和对象方法等内容。

1. 注册 Lua 脚本引擎

在使用 Lua 之前,我们需要先注册 Lua 脚本引擎。以下是具体的代码实现:

CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();
CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine);

2. 执行一段 Lua 字符串

可以使用 executeString 方法来执行一段 Lua 代码字符串。示例如下:

luaEngine->executeString("print(\"test executeString\\n\")");

3. 执行一个 Lua 文件

若要执行一个 Lua 文件,可以使用 executeScriptFile 方法。示例代码如下:

luaEngine->executeScriptFile(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("hello.lua"));

4. 执行 Lua 中的一个全局方法

使用 executeGlobalFunction 方法可以执行 Lua 中的全局方法。示例如下:

luaEngine->executeGlobalFunction("test"); // 执行 Lua 中的 test 方法

对应的 Lua 代码如下:

function test()
print("I’m lua function")
end

5. 执行 Lua 中的某个带参数的方法并获取返回值

下面的代码展示了如何执行 Lua 中带参数的方法并获取返回值:

lua_State* state = luaEngine->getLuaState();
lua_getglobal(state, "myadd"); // 查找 myadd 函数,并压入栈底
luaEngine->pushInt(5); // 函数参数 1
luaEngine->pushFloat(6.5); // 函数参数 2
lua_pcall(state, 2, 1, 0); // 调用 myadd 函数,同时会对 myadd 及两个参数进行出栈操作,并压入返回值
float result = lua_tonumber(state, -1); // 从栈中取回返回值
lua_pop(state, 1); // 清栈,由于当前只有一个返回值
printf("result is %f\n", result);

对应的 Lua 代码如下:

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

6. 在 Lua 中执行 C++ 中的一个全局方法

6.1 编写 C++ 中的全局方法

int add(lua_State* L)
{
int a = lua_tointeger(L, 1);
int b = lua_tointeger(L, 2);
lua_pushinteger(L, a + b); // 入栈返回值
return 1; // 1 表示压入栈数据个数
}

6.2 在 C++ 中注册方法

lua_register(state, "lua_add", add); // 第二个参数为将在 Lua 中用到的方法名,第三个参数为 C++ 中对应的全局函数

6.3 在 Lua 中调用方法

lua_add(2, 3);

7. 在 Lua 中调用 C++ 的对象及对象的方法

7.1 在 C++ 中编写一个 C++ 的类

#ifndef _HELLO_CLASS_CTEST_
#define _HELLO_CLASS_CTEST_
#include <iostream>

class CTest
{
public:
int v;
public:
CTest() { v = 1; }
CTest(int a) { v = a; }
void test()
{
printf("[CTest::test]hello,tolua++|(%d).\n", this->v);
}
};

#endif

7.2 编写 PKG 文件

// 如果要包含 C/C++ 的头文件,使用 $#include “xxx.h”
// 如果要包含其它的 PKG 文件,使用 $pfile “xxx.pkg”
$#include "CTest.h"

class CTest
{
int v;
CTest();
CTest(int a);
void test();
};

7.3 执行 tolua++,生成 lua_CTest.cpp 文件

tolua++ -n CTest -o lua_CTest.cpp CTest.pkg

7.4 将生成的文件加入到工程

把生成的 lua_CTest.cpp 文件添加到项目工程中。

7.5 在 Lua 中使用 C++ 的 CTest 对象

tolua_CTest_open(state); // 这个方法的名称中的 CTest 取决于执行 tolua++ 时 -n 后的参数
std::string str = "t = CTest:new(); t:test();"; // 当然也可以把 Lua 命令写到 lua 文件中,然后直接执行 lua 文件。
luaEngine->executeString(str.c_str());

需要注意的是,要顺利调用 tolua_CTest_open 方法,还需要把 lua_CTest.cpp 文件中的方法声明取出并放到合适的地方,例如:

TOLUA_API int tolua_CTest_open (lua_State* tolua_S);

通过以上步骤,你就可以在 Cocos2d-x 项目中灵活地使用 Lua 脚本进行开发了。

作者信息

feifeila

feifeila

共发布了 3994 篇文章