Quick-cocos2d-x如何修改系统原有导出类的函数

这里的系统导出类主要是指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", 0, &tolua_err)) goto tolua_lerror;
#endif


cobj = (cocos2d::Image*)tolua_tousertype(tolua_S, 1, 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, "cc.Image:lua_cocos2dx_Image_isPixelTransparent");
if (!ok)
{
tolua_error(tolua_S, "invalid arguments in function 'lua_cocos2dx_Image_isPixelTransparent'", 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)
就可以了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值