關于cocos3.x getTextureForKey的那些事

這個函數 我在看3.10的display框架的時候發現的
一直不知道有什么作用,本著曾國藩上頁不讀完不讀下頁,一本書不讀完不讀下本的精神
決定追本溯源

以下就是我發現的代碼

local fileUtils = cc.FileUtils:getInstance()
function display.getImage(imageFilename)
    local fullpath = fileUtils:fullPathForFilename(imageFilename)
    return textureCache:getTextureForKey(fullpath)
end

前面的都很好理解 什么fileUtils 文件類 textureCache其實是個
cc.Director:getInstance():getTextureCache()

getTextureForKey是什么呢
起先我以為是獲得一張圖片紋理 然后設置到精靈里面去
后來發現并不是我想的那樣

目前我發現了這個函數有3個作用

判斷你的plist png 紋理是否加載到內存里面了

    cc.SpriteFrameCache:getInstance():addSpriteFrames("filpCardAllSpr.plist", "filpCardAllSpr.png")

    local fileUtils = cc.FileUtils:getInstance()
    local fullpath = fileUtils:fullPathForFilename("filpCardAllSpr.png")
    local texture = cc.Director:getInstance():getTextureCache():getTextureForKey(fullpath)
    dump(texture, "tex = ")

輸出
"tex = " = userdata: 0x0a78e858
如果沒有addSpriteFrames
"tex = " = nil

之后在C++源碼里面搜getTextureForKey
發現還有另外2個用法

    dump(texture:getPixelFormat(), "pixel format: ")
    dump(texture:hasPremultipliedAlpha(), "premultiplied alpha: ")

輸出

"pixel format: " = 2
"premultiplied alpha: " = true

那么 這2個函數又是干什么的呢
texture:getPixelFormat 給出的翻譯是

取得當前紋理的貼圖像素格式。

參考網頁:http://www.cnblogs.com/sevenyuan/archive/2013/07/17/3195798.html

texture:hasPremultipliedAlpha()給出的翻譯是

是否有ALPHA漸變值

參考網頁:同上
參考網頁AE中的通道預乘:http://www.cgspread.com/7677.html

"pixel format: " = 2
那這個2又對應的是什么呢
發現是對應RGBA8888的
這樣就可以判斷紋理的格式了

cc.TEXTURE2_D_PIXEL_FORMAT_AUTO = 0x0
cc.TEXTURE2_D_PIXEL_FORMAT_BGR_A8888 = 0x1
cc.TEXTURE2_D_PIXEL_FORMAT_RGB_A8888 = 0x2
cc.TEXTURE2_D_PIXEL_FORMAT_RG_B888    = 0x3
cc.TEXTURE2_D_PIXEL_FORMAT_RG_B565   = 0x4
cc.TEXTURE2_D_PIXEL_FORMAT_A8        = 0x5
cc.TEXTURE2_D_PIXEL_FORMAT_I8        = 0x6
cc.TEXTURE2_D_PIXEL_FORMAT_A_I88     = 0x7
cc.TEXTURE2_D_PIXEL_FORMAT_RGB_A4444     = 0x8
cc.TEXTURE2_D_PIXEL_FORMAT_RGB5_A1       = 0x9
cc.TEXTURE2_D_PIXEL_FORMAT_PVRTC4        = 0xa
cc.TEXTURE2_D_PIXEL_FORMAT_PVRTC4A       = 0xb
cc.TEXTURE2_D_PIXEL_FORMAT_PVRTC2        = 0xc
cc.TEXTURE2_D_PIXEL_FORMAT_PVRTC2A       = 0xd
cc.TEXTURE2_D_PIXEL_FORMAT_ETC           = 0xe
cc.TEXTURE2_D_PIXEL_FORMAT_S3TC_DXT1     = 0xf
cc.TEXTURE2_D_PIXEL_FORMAT_S3TC_DXT3     = 0x10
cc.TEXTURE2_D_PIXEL_FORMAT_S3TC_DXT5     = 0x11
cc.TEXTURE2_D_PIXEL_FORMAT_DEFAULT       = 0x0

2017年7月10日21:46:50
新發現一個用法 那就是 不用plist 創建一張大圖中的一部分作為紋理

local BugSprite = class("BugSprite", function(imageFilename)
    local texture = display.getImage(imageFilename)
    local frameWidth = texture:getPixelsWide() / 3
    local frameHeight = texture:getPixelsHigh()

    local spriteFrame = display.newSpriteFrame(texture, cc.rect(0, 0, frameWidth, frameHeight))
    local sprite = display.newSprite(spriteFrame)
    sprite.animationName_ = imageFilename
    sprite.frameWidth_ = frameWidth
    sprite.frameHeight_ = frameHeight
    return sprite
end)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容