cocos2d-x lua 3.10 在lua層得到像素rgba數(shù)據(jù)

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像素鏤空

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末横殴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子梨与,更是在濱河造成了極大的恐慌,老刑警劉巖粥鞋,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呻粹,死亡現(xiàn)場離奇詭異,居然都是意外死亡窝稿,警方通過查閱死者的電腦和手機(jī)凿掂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來踪少,“玉大人糠涛,你說我怎么就攤上這事∪碳瘢” “怎么了?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長凌埂。 經(jīng)常有香客問我,道長埃疫,這世上最難降的妖魔是什么孩哑? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任横蜒,我火速辦了婚禮叙淌,結(jié)果婚禮上愁铺,老公的妹妹穿的比我還像新娘。我一直安慰自己茵乱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布督勺。 她就那樣靜靜地躺著斤贰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓷叫。 梳的紋絲不亂的頭發(fā)上送巡,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天,我揣著相機(jī)與錄音次氨,去河邊找鬼摘投。 笑死,一個胖子當(dāng)著我的面吹牛幸撕,可吹牛的內(nèi)容都是我干的圆凰。 我是一名探鬼主播,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼挑童,長吁一口氣:“原來是場噩夢啊……” “哼跃须!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起菇民,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎玛荞,沒想到半個月后呕寝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡客蹋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年孽江,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辆琅。...
    茶點(diǎn)故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡担汤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出隅很,到底是詐尸還是另有隱情率碾,我是刑警寧澤,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布绒尊,位于F島的核電站仔粥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谭羔。R本人自食惡果不足惜麦向,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望话告。 院中可真熱鬧,春花似錦沙郭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泛范。三九已至,卻和暖如春罢荡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背区赵。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工渊迁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹃彻,地道東北人算色。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓鸣皂,卻偏偏與公主長得像虐先,于是被迫代替她去往敵國和親派敷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內(nèi)容