cocos2d-x 3.x LuaBinding之LUA_FUNCTION(只为记录)

来源:互联网 发布:淘宝衣服洗过会被发现 编辑:程序博客网 时间:2024/05/23 01:24
cocos2d-x 3.x  LuaBinding之LUA_FUNCTION
转载至 http://www.cocoachina.com/bbs/read.php?tid-331648.html

用cocos2d-x+lua很久了,一直以来都在学习,相信很多童鞋都会有一个问题,就是从2.x转到3.x的时候会有点不适应, 那就是tolua里面不能直接使用LUA_FUNCTION了。之前我也在纠结过, 后面看过很多大神的帖子, 都是使用ScriptHandlerMgr代替,我也用过, 但是感觉不是特别的方便, 然后我就折腾了一下tolua的转换, 没想到真被我找到方法了。

首先大家先找到这个文件: conversions.yaml。 
不出意外的话, 应该在这个路径下 /frameworks/cocos2d-x/tools/bindings-generator/targets/lua/conversions.yaml


打开这个文件之后, 大家会看到定义了很多内容(大家都不用管), 找到 to_native: 节点, 看到这个节点我相信你也就明白是如何绑定c++类了吧。 没错, 就是你想的这样,在这个节点下面加入一句话就ok了, 这句话就是:

"LUA_FUNCTION": "${out_value} = toluafix_ref_function(tolua_S, ${arg_idx}, 0); ok &= ${out_value} >= 0"

加入之后应该是这样的

?
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
  to_native:
   # lua to native
   int:"ok &= luaval_to_int32(tolua_S, ${arg_idx},(int *)&${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "unsigned int":"ok &= luaval_to_uint32(tolua_S, ${arg_idx},&${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "unsigned char":"ok &= luaval_to_uint16(tolua_S, ${arg_idx},&${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   short:"ok &= luaval_to_int32(tolua_S, ${arg_idx},&${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "unsigned short":"ok &= luaval_to_ushort(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   char:"ok &= luaval_to_int32(tolua_S, ${arg_idx},&${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   bool:"ok &= luaval_to_boolean(tolua_S, ${arg_idx},&${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   float:"ok &= luaval_to_number(tolua_S, ${arg_idx},&${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   double:"ok &= luaval_to_number(tolua_S, ${arg_idx},&${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   long:"ok &= luaval_to_long(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   ssize_t:"ok &= luaval_to_ssize(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "unsigned long":"ok &= luaval_to_ulong(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "long long":"ok &= luaval_to_long_long(tolua_S, ${arg_idx},&${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "std::string":"ok &= luaval_to_std_string(tolua_S, ${arg_idx},&${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "String*":"std::string ${out_value}_tmp; ok &= luaval_to_std_string(tolua_S, ${arg_idx}, &${out_value}_tmp, \"${lua_namespaced_class_name}:${func_name}\"); ${out_value} = cocos2d::String::create(${out_value}_tmp)"
   "char*":"std::string ${out_value}_tmp; ok &= luaval_to_std_string(tolua_S, ${arg_idx}, &${out_value}_tmp, \"${lua_namespaced_class_name}:${func_name}\"); ${out_value} = ${out_value}_tmp.c_str()"
   "Point":"ok &= luaval_to_point(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "Vec2":"ok &= luaval_to_vec2(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "Vec3":"ok &= luaval_to_vec3(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "Vec4":"ok &= luaval_to_vec4(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "Rect":"ok &= luaval_to_rect(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "Size":"ok &= luaval_to_size(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "Color4B":"ok &=luaval_to_color4b(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "Color4F":"ok &=luaval_to_color4f(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "Color3B":"ok &= luaval_to_color3b(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "PhysicsMaterial":"ok &= luaval_to_physics_material(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "Array*":"ok &= luaval_to_array(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "Dictionary*":"ok &= luaval_to_dictionary(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "AffineTransform":"ok &= luaval_to_affinetransform(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "FontDefinition":  "ok &= luaval_to_fontdefinition(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "@Vector<.*>":"ok &= luaval_to_ccvector(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "@Map<std::basic_string.*>":"ok &= luaval_to_ccmap_string_key(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "Value":"ok &= luaval_to_ccvalue(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "ValueMap":"ok &= luaval_to_ccvaluemap(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "ValueMapIntKey":"ok &= luaval_to_ccvaluemapintkey(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "ValueVector":"ok &= luaval_to_ccvaluevector(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "@vector<std::basic_string.*>":"ok &= luaval_to_std_vector_string(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "@vector<int.*>":"ok &= luaval_to_std_vector_int(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "kmMat4":"ok &= luaval_to_kmMat4(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "Mat4":"ok &= luaval_to_mat4(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "BlendFunc":"ok &= luaval_to_blendfunc(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "_ttfConfig":"ok &= luaval_to_ttfconfig(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "MeshVertexAttrib":"ok &= luaval_to_mesh_vertex_attrib(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "@vector<float.*>":"ok &= luaval_to_std_vector_float(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "@vector<unsigned short.*>":"ok &= luaval_to_std_vector_ushort(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "AnimationInfo":"ok &= luaval_to_animationInfo(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
   "TexParams":"ok &= luaval_to_texparams(tolua_S, ${arg_idx}, &${out_value}, \"${lua_namespaced_class_name}:${func_name}\")"
 
 
   object:"ok &= luaval_to_object<${arg.to_string($generator).replace(\"*\", \"\")}>(tolua_S, ${arg_idx}, \"${scriptname}\",&${out_value})"
 
 
   "LUA_FUNCTION":"${out_value} = toluafix_ref_function(tolua_S, ${arg_idx}, 0); ok &= ${out_value} >= 0"
 
 
  from_native:
   # native to lua
   int:"tolua_pushnumber(tolua_S,(lua_Number)${in_value})"



完成之后你就可以写自己的类

#include "cocos2d.h"
#include "CCLuaEngine.h"


USING_NS_CC;
class MyClass:public cocos2d::Ref{
public:
    MyClass();
    MyClass();


    void test(LUA_FUNCTION nHandler);
}



然后编写ini文件 和genbindings.py文件, 运行导出后就可以在lua里面直接使用了。

cc.MyClass:test(function()


end)
0 0
原创粉丝点击