这里的系统导出类主要是指Sprite、Image这种cocos2dx lua默认就导出的类,有时候部分cocos2dx c++对应类的接口并没有导出,这就需要我们自己
添加导出
函数。相比于
自定义类的导出,要简单不少。 首先确定这些类的导出定义在工程中的\frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto\lua_cocos2dx_auto.cpp中,比如lua_cocos2dx_Node_开头的
函数就是Node类的导出定义。 基本步骤: 1)
添加对应的导出
函数,lua_cocos2dx_类名_
函数名 2)在对应的"lua_register_cocos2dx_类名"
函数中
添加对应的导出定义 3)重新编译即可 例如:
Image类并没有提供一个返回某个点是否透明的
函数,下面
添加一下 1)在lua_cocos2dx_auto.cpp中
添加lua_cocos2dx_Image_isPixelTransparent
函数 int lua_cocos2dx_Image_isPixelTransparent(lua_State* tolua_S) { int argc = 0; cocos2d::Image* cobj = nullptr; bool ok = true; #if COCOS2D_DEBUG >= 1 tolua_Error tolua_err; #endif #if COCOS2D_DEBUG >= 1 if (!tolua_isusertype(tolua_S,1,"cc.Image",&tolua_err)) goto tolua_lerror; #endif cobj = (cocos2d::Image*)tolua_tousertype(tolua_S,0); #if COCOS2D_DEBUG >= 1 if (!cobj) { tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_Image_getWidth'",nullptr); return 0; } #endif argc = lua_gettop(tolua_S) - 1; if (argc == 2) { int arg0; int arg1; ok &= luaval_to_int32(tolua_S,2,&arg0,"cc.Image:lua_cocos2dx_Image_isPixelTransparent"); if (!ok) { tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_Image_isPixelTransparent'",nullptr); return 0; } ok &= luaval_to_int32(tolua_S,3,&arg1,nullptr); return 0; } unsigned char *data = cobj->getData(); //这里就是
图片数据了 int len = cobj->getDataLen(); int x = arg0; int y = arg1; //根据刚刚计算的相对坐标值,计算出触摸点代表了哪一个像素点 然后再
提取出该像素点的alpha值 //注意:因为
图片坐标(0,0)是在左上角,所以要和触摸点的Y转换一下,也就是“(myImage->getHeight() - (int)(ps.y) - 1)” //该data值是把二维数组展开成一个一维数组,因为每个像素值由RGBA组成,所以每隔4个char为一个RGBA,并且像素以横向排列 int pa = 4 * ((cobj->getHeight() - (int)(y)-1) * cobj->getWidth() + (int)(x)) + 3; bool ret = true; if (pa >= len) { ret = true; } else { unsigned int ap = data[pa]; if (ap == 0) { ret = true; } else { ret = false; } } tolua_pushnumber(tolua_S,(lua_Number)ret); return 1; } luaL_error(tolua_S,"%s has wrong number of arguments: %d,was expecting %d \n","cc.Image:isPixelTransparent",argc,2); return 0; #if COCOS2D_DEBUG >= 1 tolua_lerror: tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_Image_isPixelTransparent'.",&tolua_err); #endif return 0; } 2)在
函数lua_register_cocos2dx_Image中,
添加 tolua_function(tolua_S,"isPixelTransparent",lua_cocos2dx_Image_isPixelTransparent); 3)编译C++
代码 4)在lua中使用 local image = cc.Image:new() image:initWithImageFile("res/star.png") local isTransparent = image:isPixelTransparent(100,100) print("isTransparent=",isTransparent) 就可以了