【步兵 cocos2dx】lua绑定 By EOS.
最近想搞一搞自动化测试,涉及到luabinding,简单的写一篇教程。
不过并不打算写很仔细,因为这种东西网上太多一搜一大片。
刚刚实现了模拟点击,绑定到lua上了,再读取个文件模拟各种点击行为,
配合脚本每个配置文件重启运行、遍历log文件,发现error就把log文件cp过来,统计报错。
感觉大有搞头,想想都美滋滋,趁着心情好写一篇刚刚用的luabinding。
需要的东西
1、项目下两个必备的目录,从cocos官方目录下考过来
cocos2d\tools\bindings-generator
cocos2d\tools\tolua
2、必备的运行luabinding的python工具需要安装的东西
cocos2d\tools\tolua\README.mdown中都有写
[python-2.7.3.msi, PyYAML-3.11.win32-py2.7.exe, Cheetah.zip]
3、c++文件,也就是需要绑定的文件
4、复制一份 ini文件重命名(es.ini)
[es]
prefix = es
target_namespace = es
headers = %(cocosdir)s/../Classes/CppTools.h
classes = CppTools
classes_have_no_parents = CppTools
#除了以上修改,其他信息均默认即可
5、复制一份genbindings.py重命名(es_genbindings.py)
output_dir = '%s/../Classes/bindings' % project_root
cmd_args = {'es.ini' : ('es', 'lua_es_auto')}
#其他均默认,一个py对应N个ini、所以后续只需添加ini即可
生成和注册
生成:
运行python es_genbindings.py
就可以看到在Classes/bindings下生成的对应的文件。
注册:
//[lua_module_register_mine.h]
#ifndef __MINE_LUA_MODULE_REGISTER_H__
#define __MINE_LUA_MODULE_REGISTER_H__
#include "lua.h"
#include "scripting/lua-bindings/manual/Lua-BindingsExport.h"
CC_LUA_DLL int lua_module_register_mine(lua_State* L);
#endif
//[lua_module_register_mine.cpp]
#include "lua_module_register_mine.h"
#include "bindings/lua_es_auto.hpp"
int lua_module_register_mine(lua_State* L)
{
register_all_es(L);
return 1;
}
//[AppDelegate.cpp]
#include "lua_module_register_mine.h"
//.....
LuaStack* stack = engine->getLuaStack();
lua_State* L = stack->getLuaState();
lua_module_register(L);//cocos自带,写在一起就对了
lua_module_register_mine(L);
注:有一点不足,到处的cpp文件有一个路径是不对的,需要手动改一下。
不过不改编译会出错,不会遗漏的=、=
打包mk文件修改
[Android.mk]
#我这里是proj.android-studio,
#proj.andorid 应该是$(LOCAL_PATH)/../../Classes/*.cpp
MY_CPP_LIST := hellocpp/main.cpp
MY_CPP_LIST += $(wildcard $(LOCAL_PATH)/../../../Classes/*.cpp)
MY_CPP_LIST += $(wildcard $(LOCAL_PATH)/../../../Classes/bindings/*.cpp)
LOCAL_SRC_FILES := $(MY_CPP_LIST:$(LOCAL_PATH)/%=%)
网上也有递归自动搜索路径的,不过我是lua开发,这样够用了,而且就算路径变多,
写个脚本输出一下也是分分钟的事情,懒得折腾了,ruby: required ‘find’ 是个好东西。
齐活,生存在开发路径下的luabinding就完成了。
最后是lua的调用,就再简单不过了
ctl = es.CppTools
ctl.moniClick(130, 221, 1)--[x, y, delay]
总结
除非必须我是不建议,把自己的代码混在底层代码里的。因为这样如果cocos修复了某些bug进行,
版本升级或者代码合并的时候会给自己添加很多不必要的麻烦。
lua更是如此,cocos自带的lua代码,理都不要理它,看着不爽require一个覆盖掉,
[bushuangCocos.lua]
cc.p = function(x, y)
local pos = {x=x, y=y}
function pos:add(a_x, a_y)
_ = a_x and self.x = self.x + a_x
_ = a_y and self.y = self.y + a_y
end
return pos
end
require "cocos/init"
require "bushuangCocos"
就写这么多,晚安~
See Again~
之前
真爱无价,欢迎打赏~