C++層實(shí)現(xiàn)原文:
http://www.reibang.com/p/16fa878f74c2
因?yàn)閘ua層 沒有
Image:getData()
這個接口
所以只能自己導(dǎo)出
為了避免導(dǎo)出整個數(shù)據(jù) 可能會引起大容量內(nèi)存的復(fù)制
所以我只做了一個 得到一個像素點(diǎn)數(shù)據(jù)的接口
接口如下:
//G:\Mycocos310Cpp\touchAlpha\cocos2d\cocos\platform\CCImage.h
Color4B Image::getOneData(int nTouch_x, int nTouch_y, Size imageSize)
{
int picx = nTouch_x;
//png在內(nèi)存中是從左上角開始讀取像素的 而cocos是左下角開始 需要轉(zhuǎn)換(記得-1)
int picy = imageSize.height - nTouch_y - 1;
CCLOG("x = %d, y = %d", picx, picy);
Color4B color4B = { 0, 0, 0, 0 };
unsigned int *pixel = (unsigned int *)_data;
pixel = pixel + (picy * (int)imageSize.width) * 1 + picx * 1;
//R通道
color4B.r = *pixel & 0xff;
//G通道
color4B.g = (*pixel >> 8) & 0xff;
//B通過
color4B.b = (*pixel >> 16) & 0xff;
//Alpha通道茉兰,我們有用的就是Alpha
color4B.a = (*pixel >> 24) & 0xff;
return color4B;
}
//G:\Mycocos310Cpp\touchAlpha\cocos2d\cocos\platform\CCImage.cpp
/**
@by lyf 2017年11月11日(雙十一)
@得到一個像素的數(shù)據(jù)
@param nTouch_x 鼠標(biāo)點(diǎn)擊到圖片的坐標(biāo) X 從左下角開始計算
@param nTouch_y 鼠標(biāo)點(diǎn)擊到圖片的坐標(biāo) X 從左下角開始計算
@param imageSize 圖片的范圍大小 getContentSize()
@return 該像素點(diǎn)顏色值(包括alpha通道)
*/
Color4B getOneData(int nTouch_x, int nTouch_y, Size imageSize);
導(dǎo)出到lua接口
//E:\Cocos\Cocos2d-x\cocos2d-x-3.10\cocos\scripting\lua-bindings\auto\lua_cocos2dx_auto.cpp
tolua_function(tolua_S, "getOneData", lua_cocos2dx_Image_getOneData);
image.png
//E:\Cocos\Cocos2d-x\cocos2d-x-3.10\cocos\scripting\lua-bindings\auto\lua_cocos2dx_auto.cpp
//新增lua導(dǎo)出獲得一個像素點(diǎn)的具體像素值 包括通道
int lua_cocos2dx_Image_getOneData(lua_State* tolua_S)
{
int argc = 0;
cocos2d::Image* cobj = nullptr;
bool ok = true;
#if COCOS2D_DEBUG >= 1
tolua_Error tolua_err;
#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_getOneData'", nullptr);
return 0;
}
#endif
argc = lua_gettop(tolua_S) - 1;
if (argc == 3)
{
int arg0;
int arg1;
cocos2d::Size arg2;
ok &= luaval_to_int32(tolua_S, 2, (int *)&arg0, "cc.Image:getOneData");
if (!ok)
{
tolua_error(tolua_S, "invalid arguments in function 'lua_cocos2dx_Image_getOneData'", nullptr);
return 0;
}
ok &= luaval_to_int32(tolua_S, 3, (int *)&arg1, "cc.Image:getOneData");
if (!ok)
{
tolua_error(tolua_S, "invalid arguments in function 'lua_cocos2dx_Image_getOneData'", nullptr);
return 0;
}
ok &= luaval_to_size(tolua_S, 4, &arg2, "cc.Image:getOneData");
if (!ok)
{
tolua_error(tolua_S, "invalid arguments in function 'lua_cocos2dx_Image_getOneData'", nullptr);
return 0;
}
const cocos2d::Color4B& ret = cobj->getOneData(arg0, arg1, arg2);
color4b_to_luaval(tolua_S, ret);
return 1;
}
luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "ccui.Text:getTextColor", argc, 0);
return 0;
#if COCOS2D_DEBUG >= 1
tolua_lerror:
tolua_error(tolua_S, "#ferror in function 'lua_cocos2dx_Image_getOneData'.", &tolua_err);
#endif
return 0;
}
寫完后編譯
拷貝發(fā)生改變的exe 和 libcocos2d.dll
image.png
因?yàn)槲沂窃诳蚣茼?xiàng)目中改變的 其余項(xiàng)目共享exe 和dll框架
所以框架改變后需要拷貝 如果只是一份項(xiàng)目 則無需此步
lua層調(diào)用代碼 先來個簡單的接口調(diào)用部分
--i:\Test310\simulator\win32\src\app\views\MainScene.lua
local MainScene = class("MainScene", cc.load("mvc").ViewBase)
--MainScene.RESOURCE_FILENAME = "MainScene.csb"
function MainScene:onCreate()
printf("resource node = %s", tostring(self:getResourceNode()))
self.sprite = cc.Sprite:create("red3.png")
self.sprite:setPosition(50, 50)
self:addChild(self.sprite, 1)
local size = self.sprite:getContentSize() -- 返回size
local pImage = cc.Image:new()
pImage:initWithImageFile("red3.png")
local size = self.sprite:getContentSize()
for j = 0, 2 do
for i = 0, 2 do
print(i, j)
local ovt = pImage:getOneData(i, j, size)
dump(ovt, "ovt = ")--僅需這里打印像素數(shù)據(jù)測試
end
end
--pImage 這里結(jié)束后就直接回收了 沒有addChild
end
return MainScene
打印結(jié)果
[LUA-print] resource node = nil
libpng warning: iCCP: known incorrect sRGB profile
[LUA-print] 0 0
[LUA-print] dump from: [string ".\app/views/MainScene.lua"]:20: in function 'onC
reate'
[LUA-print] - "ovt = " = {
[LUA-print] - "a" = 255
[LUA-print] - "b" = 0
[LUA-print] - "g" = 255
[LUA-print] - "r" = 92
[LUA-print] - }
[LUA-print] 1 0
[LUA-print] dump from: [string ".\app/views/MainScene.lua"]:20: in function 'onC
reate'
[LUA-print] - "ovt = " = {
[LUA-print] - "a" = 255
[LUA-print] - "b" = 0
[LUA-print] - "g" = 255
[LUA-print] - "r" = 92
[LUA-print] - }
[LUA-print] 2 0
[LUA-print] dump from: [string ".\app/views/MainScene.lua"]:20: in function 'onC
reate'
[LUA-print] - "ovt = " = {
[LUA-print] - "a" = 255
[LUA-print] - "b" = 0
[LUA-print] - "g" = 255
[LUA-print] - "r" = 92
[LUA-print] - }
[LUA-print] 0 1
[LUA-print] dump from: [string ".\app/views/MainScene.lua"]:20: in function 'onC
reate'
[LUA-print] - "ovt = " = {
[LUA-print] - "a" = 255
[LUA-print] - "b" = 0
[LUA-print] - "g" = 255
[LUA-print] - "r" = 92
[LUA-print] - }
[LUA-print] 1 1
[LUA-print] dump from: [string ".\app/views/MainScene.lua"]:20: in function 'onC
reate'
[LUA-print] - "ovt = " = {
[LUA-print] - "a" = 0
[LUA-print] - "b" = 0
[LUA-print] - "g" = 0
[LUA-print] - "r" = 0
[LUA-print] - }
[LUA-print] 2 1
[LUA-print] dump from: [string ".\app/views/MainScene.lua"]:20: in function 'onC
reate'
[LUA-print] - "ovt = " = {
[LUA-print] - "a" = 255
[LUA-print] - "b" = 0
[LUA-print] - "g" = 255
[LUA-print] - "r" = 92
[LUA-print] - }
[LUA-print] 0 2
[LUA-print] dump from: [string ".\app/views/MainScene.lua"]:20: in function 'onC
reate'
[LUA-print] - "ovt = " = {
[LUA-print] - "a" = 255
[LUA-print] - "b" = 0
[LUA-print] - "g" = 255
[LUA-print] - "r" = 92
[LUA-print] - }
[LUA-print] 1 2
[LUA-print] dump from: [string ".\app/views/MainScene.lua"]:20: in function 'onC
reate'
[LUA-print] - "ovt = " = {
[LUA-print] - "a" = 255
[LUA-print] - "b" = 0
[LUA-print] - "g" = 255
[LUA-print] - "r" = 92
[LUA-print] - }
[LUA-print] 2 2
[LUA-print] dump from: [string ".\app/views/MainScene.lua"]:20: in function 'onC
reate'
[LUA-print] - "ovt = " = {
[LUA-print] - "a" = 255
[LUA-print] - "b" = 0
[LUA-print] - "g" = 255
[LUA-print] - "r" = 92
[LUA-print] - }
上傳圖片樣式
image.png
可自行下載原圖
red3.png
圖片就是一張9像素 3*3的綠色圖片 中間1像素鏤空