首先给很多不了解为什么要用lua做脚本的同学普及一下。
举个例子。
我们开发一款游戏。比如现在最火热的lol。大家都知道,每隔一段时间,官方都会对某一个或多个角色进行调整。
这时候放到我们手机游戏中是什么样子的呢?几十个角色,每次调整都要升级一次应用的版本,然后等待审核,然后用户下载更新。。。。
天啊。想想就可怕。但是lua有一种我们称之为“游戏脚本热更新”的机制,保证了我们遇到这种情况,不需要升级版本。而是简单的更新下lua或者资源就可以了。
当然还有其他情况,比如更新皮肤包。举行一个七夕活动等等等等。
下面为正文。
我知道创建项目的时候直接选择语言lua就可以使用cocos2d-x写好的lua引擎。
但是,还是有很多情况下,我只是单纯的想要在c++语言下把lua当作一个纯粹的脚本来使用。
我不需要用lua做页面,不需要lua如何如何。它仅仅只是一个脚本。我使用lua实现一些游戏上的逻辑等等。
这个时候,可能我或者其他很多人都不希望创建一个lua语言的项目。那么怎么办呢?
请往下看。
以下所有操作是在mac系统下,使用xcode进行的
首先,去lua官网下载最新的lua包。http://www.lua.org 截至到目前为止,我下的released版本是5.3.1
下成功后,会有一个lua-5.3.1.tar的压缩包。解压缩。
然后进入命令行,进入到解压后的根目录。如下:
执行命令 make macosx
成功后,进入src目录。会发现生成出来很多新的文件。最主要的一个就是liblua.a 这个文件如果没有的话,就不必看下面的了。
然后新建cocos2d-x项目,语言选择cpp
初始的文件结构应该是下面这样的。
接下来选择
File->New->Target创建一个静态库
不同xcode的版本,这里显示的有可能会不一样。但是总归都是要创建一个静态库就是了。创建完后,目录结构应该是下面这个样子的
这时,我们把刚才lua解压缩包里的src文件夹拖动到lua文件夹下
拖动后,应该出现下面这个界面
默认是勾选上的,把勾去掉。然后点击Next。
注意我的选择,Add to targets:选择lua。不要选择了之前的rontest-mobile。(之前测试的时候,貌似如果选了会有问题)
接下来,看图说话。按照1,2,3,4的步骤。最后点击步骤4上的+号
接下来选择刚才的静态库下面的liblua.a然后点击Add
到目前为止,如果和我的步骤一样,那么lua库就已经成功导入进来了。
接下来就是写代码了
除了红框里的,其他的都是默认代码
extern "C" {
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
};
编译运行,如果没有报错,说明之前我们的操作都成功了。lua库也确实成功导入进来。如果报错...那就要看具体情况了。之前测试的时候,我也遇到各种问题。后来都百度掉了。
加上红框中的代码。代码如下
std::string lua_file = FileUtils::getInstance()->fullPathForFilename("hello.lua");
lua_State* pL = luaL_newstate();
luaL_openlibs(pL);
/* 1.执行Lua脚本,返回0代表成功 */
int err = luaL_dofile(pL, lua_file.data());
CCLOG("open : %d", err);
/* 2.重置栈顶索引 */
lua_settop(pL, 0);
lua_getglobal(pL, "myName");
/* 3.判断栈顶的值的类型是否为String, 返回非0值代表成功 */
int isstr = lua_isstring(pL, 1);
CCLOG("isstr = %d", isstr);
/* 4.获取栈顶的值 */
const char* str = lua_tostring(pL, 1);
CCLOG("getStr = %s", str);
lua_close(pL);
注意lua_file这个地方。之前我用 luaL_dofile(pL, "hello.lua");无论把这个hello.lua文件放到哪里都找不到文件。最后发现必须获取到完整的路径才可以。
当然,考虑到我对cocos2d-x和c++的了解都不是很深入,我可以很确定,还会有其他的方式实现。
res文件夹下创建hello.lua文件。
hello.lua
myName = "Ron"
代码非常简单。运行出现下面结果
我是用cocos studio建立的项目,如果是命令行建立的项目,有可能找不到res文件夹下面的hello.lua文件。这时候加上下面这句命令就可以了。
FileUtils::getInstance()->addSearchPath("res");
到此为止,cocos2d-x 的c++语言使用lua脚本已经完全可以正常运行。
接下来我要继续后面的研究了。