您的位置:首页 > 移动开发 > Cocos引擎

为Cocos2d-x项目增加lua支持

2016-10-26 20:28 411 查看
为Cocos2d-x项目增加lua支持

1.利用python创建新的项目,在cocos2d-x-2.2.3\tools\project-creator文件目录下按下shift鼠标右键打开命令窗口

2.输入命令:python create_project.py -project mygame -package com.hck.game -language cpp其中mygame是项目名称,com.hck.game是项目包名

3.新建好项目后打开mygame.sln

4.添加库项目 右击解决方案’mygame’-->添加-->现有项目,找到win32下的liblua.vcxproj,添加进来

5.添加库项目引用 右击mygame-->属性-->引用,liblua处勾上

6.添加路径 C/C++-->附加包含目录,添加该类库的路径,(你的cocos项目路径\scripting\lua)$(ProjectDir)..\..\..\scripting\lua,若哪个文件找不到时,记得添加到附加包含目录里

7.链接器-->输入-->附加依赖项,添加liblua.lib,lua51.lib两个lib文件

8.Lua文件添加到项目的resources文件里

9.在需要读取lua脚本的cpp文件里,添加#include "cocos2dx_support/CCLuaEngine.h"

10.C++内调用lua函数

方式一:Cpp文件

CCLuaE
4000
ngine* g_pEngine = NULL; //全局LUA引擎(单例)

//并在init函数里,添加

if (g_pEngine == NULL)//这样做是为了保证g_pEngine只被初始化一次

{

g_pEngine = CCLuaEngine::defaultEngine();

CCScriptEngineManager::sharedManager()->setScriptEngine(g_pEngine);

}

std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename("MyLua.lua");//LUA脚本的名字

g_pEngine->executeScriptFile(path.c_str());

 

int nResult = -1;

//执行脚本内函数 传入主Layer的Tag值 和 要构造节点的Tag值

g_pEngine->executeGlobalFunction("add");//lua方法名字

//输出返回值

CCLOG("AddSomething Result is %d", nResult);

 

方式二:添加头文件:

extern "C" {

#include <lua.h>

#include <lualib.h>

#include <lauxlib.h>

};

注意:虽然有好几个lua.h文件,但是lua.h在附加包含目录的路径只能有一个,否则会出现方法函数不知道要找哪一个lua.h!

Cpp文件

lua_State* pL = lua_open();//初始化

luaopen_base(pL);

luaL_dofile(pL, "MyLua.lua");//执行脚本

lua_getglobal(pL, "add");//执行脚本内add方法,将add函数放到栈中

lua_pushnumber(pL, 10);//传入lua方法的第一个参数

lua_pushnumber(pL, 5);//传入lua方法的第二个参数,把函数所需要的数据都放入栈中

lua_call(pL, 2, 1);//第二参数表示函数参数的个数,第二个表示返回值的个数

int iResult = lua_tonumber(pL, -1);

CCLOG("iResult = %d", iResult);//函数返回的结果

 

11.Lua调用C++函数

.h:static int getNumber(int num);

.cpp:

int HelloWorld::getNumber(int num)

{

CCLOG("getnumber!! = %d",num);

return num*num;

}

 

想在lua中调用上面的函数,就必须再多写一个函数

.h:static int cpp_getNumber(lua_State* pL);

.cpp:

int HelloWorld::cpp_getNumber(lua_State* pL)

{

int num = (int)lua_tonumber(pL, -1);//从栈顶中取一个值

lua_pushnumber(pL, getNumber(num));//调用getNumber函数,将返回值入栈

return 1;//getNumber只有一个返回值,所以return 1;

}

Lua:local num = cpp_GetNumber(10);

 

Init()内需添加两个函数

 

lua_State* pL = lua_open();

luaopen_base(pL);

lua_register(pL, "cpp_getNumber", cpp_getNumber);

luaL_dofile(pL, "MyLua.lua");

lua_close(pL);

 

输出:getnumber!! = 10  //调用成功hhh

注意:两个函数都必须为静态函数哦,lua可以通过lua_register将C++的静态函数注册到lua中,这样lua就可以直接调用C++的函数啦!

cpp_GetNumber函数为什么非得是静态的,如果不是静态函数,就必须在对象被创建之后才能调用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息