Cocos2d-x 3.2 Lua示例 AssetsManagerTest(資源管理器)

https://blog.csdn.net/wwj_748/article/details/38368061

本篇博客介紹Cocos2d-x 爲我們提供的一個類——AssetsManager在Lua中的使用例子,效果如下圖:




Cocos2d-x 給出的例子是AssetsManagerTest,進入會發現三個菜單項:
  • enter
  • reset
  • update
enter是進入場景,reset是刪除本地版本,重新設置,update就是更新資源文件。


筆者使用LDT打開lua-tests測試項目:



在src目錄下找到AssetsManagerTest目錄,查看以下代碼(筆者對其進行了註釋):
>>>AsetsManagerModule.lua
[javascript] view plain copy
  1. --[[  
  2. 資源管理器模塊  
  3. ]]--  
  4. local AssetManagerModule = {}  
  5.   
  6. --[[  
  7.   newScene  
  8. ]]--  
  9. function AssetManagerModule.newScene(backfunc)  
  10.   
  11.   -- 獲取屏幕大小  
  12.   local winSize = cc.Director:getInstance():getWinSize()  
  13.   
  14.   -- 創建新的場景  
  15.   local newScene = cc.Scene:create()  
  16.   -- 創建新的層  
  17.   local layer    = cc.Layer:create()  
  18.   
  19.   -- 後臺更新  
  20.   local function backToUpdate()  
  21.     local scene = backfunc()  
  22.     if scene ~= nil then  
  23.       cc.Director:getInstance():replaceScene(scene)  
  24.     end  
  25.   end  
  26.   
  27.   -- 創建回退菜單  
  28.   cc.MenuItemFont:setFontName("Arial")  
  29.   cc.MenuItemFont:setFontSize(24)  
  30.   local backMenuItem = cc.MenuItemFont:create("Back")  
  31.   -- 放置在右下角大致的位置  
  32.   backMenuItem:setPosition(cc.p(VisibleRect:rightBottom().x - 50, VisibleRect:rightBottom().y + 25))  
  33.   -- 註冊監聽方法  
  34.   backMenuItem:registerScriptTapHandler(backToUpdate)  
  35.   
  36.   -- 創建菜單  
  37.   local backMenu = cc.Menu:create()  
  38.   backMenu:setPosition(0, 0)  
  39.   backMenu:addChild(backMenuItem)  
  40.   layer:addChild(backMenu,6)  
  41.   
  42.   -- 創建標籤  
  43.   local helloLabel =  cc.Label:createWithTTF("Hello World", s_arialPath, 38)  
  44.   helloLabel:setAnchorPoint(cc.p(0.5, 0.5))-- 錨點居中  
  45.   helloLabel:setPosition(cc.p(winSize.width / 2, winSize.height - 40))  
  46.   layer:addChild(helloLabel, 5)  
  47.   
  48.   -- 創建精靈,這裏是一張背景圖  
  49.   local sprite = cc.Sprite:create("Images/background.png")  
  50.   sprite:setAnchorPoint(cc.p(0.5, 0.5))-- 錨點居中  
  51.   sprite:setPosition(cc.p(winSize.width / 2, winSize.height / 2))  
  52.   layer:addChild(sprite, 0)  
  53.   
  54.   newScene:addChild(layer)-- 添加到場景  
  55.   cc.Director:getInstance():replaceScene(newScene)-- 替換場景  
  56. end  
  57.   
  58.   
  59. -- 返回模塊  
  60. return AssetManagerModule  

>>>AssetsManagerTest.lua
[javascript] view plain copy
  1. -- 獲取目標平臺  
  2. local targetPlatform = cc.Application:getInstance():getTargetPlatform()  
  3.   
  4. local lineSpace = 40 -- 行間距  
  5. local itemTagBasic = 1000   
  6. local menuItemNames =  
  7. {  
  8.     "enter",  
  9.     "reset",  
  10.     "update",  
  11. }  
  12.   
  13. -- 獲取屏幕大小  
  14. local winSize = cc.Director:getInstance():getWinSize()  
  15.   
  16. -- 更新層  
  17. local function updateLayer()  
  18.     -- 首先創建一個層  
  19.     local layer = cc.Layer:create()  
  20.   
  21.     local support  = false  
  22.     -- 判斷是否支持iphone、ipad、win32、android或者mac  
  23.     if (cc.PLATFORM_OS_IPHONE == targetPlatform) or (cc.PLATFORM_OS_IPAD == targetPlatform)   
  24.         or (cc.PLATFORM_OS_WINDOWS == targetPlatform) or (cc.PLATFORM_OS_ANDROID == targetPlatform)   
  25.         or (cc.PLATFORM_OS_MAC  == targetPlatform) then  
  26.         support = true  
  27.     end  
  28.   
  29.     -- 如果不支持平臺  
  30.     if not support then  
  31.         print("Platform is not supported!")  
  32.         return layer  
  33.     end  
  34.   
  35.     local isUpdateItemClicked = false -- 是否更新項被點擊  
  36.     local assetsManager       = nil -- 資源管理器對象  
  37.     local pathToSave          = ""  -- 保存路徑  
  38.   
  39.     local menu = cc.Menu:create() -- 菜單  
  40.     menu:setPosition(cc.p(0, 0))  -- 設置菜單位置  
  41.     cc.MenuItemFont:setFontName("Arial")-- 設置菜單字體樣式  
  42.     cc.MenuItemFont:setFontSize(24) -- 設置字體大小  
  43.   
  44.     -- 用於更新的標籤  
  45.     local progressLable = cc.Label:createWithTTF("",s_arialPath,30)  
  46.     progressLable:setAnchorPoint(cc.p(0.5, 0.5))  
  47.     progressLable:setPosition(cc.p(140,50))  
  48.     layer:addChild(progressLable)  
  49.   
  50.     -- 下載目錄  
  51.     pathToSave = createDownloadDir()  
  52.   
  53.     -- 下載錯誤回調  
  54.     local function onError(errorCode)  
  55.         -- 沒有新版本  
  56.         if errorCode == cc.ASSETSMANAGER_NO_NEW_VERSION then  
  57.             progressLable:setString("no new version")  
  58.         elseif errorCode == cc.ASSETSMANAGER_NETWORK then  
  59.             -- 網絡錯誤  
  60.             progressLable:setString("network error")  
  61.         end  
  62.     end  
  63.   
  64.     -- 進度更新回調  
  65.     local function onProgress( percent )  
  66.         -- 顯示下載進度  
  67.         local progress = string.format("downloading %d%%",percent)  
  68.         progressLable:setString(progress)  
  69.     end  
  70.       
  71.     -- 下載成功方法回調  
  72.     local function onSuccess()  
  73.         progressLable:setString("downloading ok")  
  74.     end  
  75.     
  76.     -- 獲得資源管理器  
  77.     local function getAssetsManager()  
  78.         if nil == assetsManager then  
  79.             -- 創建一個資源管理器,第一個參數是zip包下載地址,第二個參數是版本文件,第三個參數是保存路徑  
  80.             assetsManager = cc.AssetsManager:new("https://raw.github.com/samuele3hu/AssetsManagerTest/master/package.zip",  
  81.                                            "https://raw.github.com/samuele3hu/AssetsManagerTest/master/version",  
  82.                                            pathToSave)  
  83.             -- 保留所有權,該方法會增加Ref對象的引用計數  
  84.             assetsManager:retain()  
  85.             -- 設置一系列委託  
  86.             assetsManager:setDelegate(onError, cc.ASSETSMANAGER_PROTOCOL_ERROR )  
  87.             assetsManager:setDelegate(onProgress, cc.ASSETSMANAGER_PROTOCOL_PROGRESS)  
  88.             assetsManager:setDelegate(onSuccess, cc.ASSETSMANAGER_PROTOCOL_SUCCESS )  
  89.             assetsManager:setConnectionTimeout(3)-- 設置連接超時  
  90.         end  
  91.   
  92.         return assetsManager  
  93.     end  
  94.   
  95.     -- 更新  
  96.     local function update(sender)  
  97.         progressLable:setString("")  
  98.         -- 調用AssetsManager的update方法  
  99.         getAssetsManager():update()  
  100.     end  
  101.   
  102.     -- 重設  
  103.     local function reset(sender)  
  104.         progressLable:setString("")  
  105.         -- 刪除下載路徑  
  106.         deleteDownloadDir(pathToSave)  
  107.           
  108.         -- 刪除版本  
  109.         getAssetsManager():deleteVersion()  
  110.          
  111.         -- 創建下載路徑  
  112.         createDownloadDir()  
  113.     end  
  114.   
  115.     -- 重新加載模塊  
  116.     local function reloadModule( moduleName )  
  117.   
  118.         package.loaded[moduleName] = nil  
  119.         
  120.         return require(moduleName)  
  121.     end  
  122.   
  123.   
  124.     -- 進入  
  125.     local function enter(sender)  
  126.         -- 如果更新按鈕沒有被點擊  
  127.         if not isUpdateItemClicked then  
  128.             local realPath = pathToSave .. "/package"  
  129.             addSearchPath(realPath,true)  
  130.         end  
  131.           
  132.         -- 重新加載模塊  
  133.         assetsManagerModule = reloadModule("src/AssetsManagerTest/AssetsManagerModule")  
  134.   
  135.         assetsManagerModule.newScene(AssetsManagerTestMain)  
  136.     end  
  137.   
  138.     -- 回調方法  
  139.     local callbackFuncs =  
  140.     {  
  141.         enter,  
  142.         reset,  
  143.         update,  
  144.     }  
  145.   
  146.     -- 菜單回調方法  
  147.     local function menuCallback(tag, menuItem)  
  148.         local scene = nil  
  149.         local nIdx = menuItem:getLocalZOrder() - itemTagBasic  
  150.         local ExtensionsTestScene = CreateExtensionsTestScene(nIdx)  
  151.         if nil ~= ExtensionsTestScene then  
  152.             cc.Director:getInstance():replaceScene(ExtensionsTestScene)  
  153.         end  
  154.     end  
  155.   
  156.     -- 遍歷添加三個菜單項  
  157.     for i = 1, table.getn(menuItemNames) do  
  158.         local item = cc.MenuItemFont:create(menuItemNames[i])  
  159.         item:registerScriptTapHandler(callbackFuncs[i])-- 註冊點擊回調地址  
  160.         -- 設置三個菜單的位置  
  161.         item:setPosition(winSize.width / 2, winSize.height - i * lineSpace)  
  162.         if not support then  
  163.             item:setEnabled(false)  
  164.         end  
  165.         menu:addChild(item, itemTagBasic + i)  
  166.     end  
  167.   
  168.     local function onNodeEvent(msgName)  
  169.         if nil ~= assetsManager then  
  170.             -- 釋放資源  
  171.             assetsManager:release()  
  172.             assetsManager = nil  
  173.         end  
  174.     end  
  175.   
  176.     -- 註冊層的點擊回調方法  
  177.     layer:registerScriptHandler(onNodeEvent)  
  178.       
  179.     layer:addChild(menu)  
  180.   
  181.     return layer  
  182. end  
  183.   
  184. -------------------------------------  
  185. --  AssetsManager Test  
  186. -------------------------------------  
  187. function AssetsManagerTestMain()  
  188.     local scene = cc.Scene:create()  
  189.     scene:addChild(updateLayer())  
  190.     scene:addChild(CreateBackMenuItem())  
  191.     return scene  
  192. end  

以下這張圖截自官網:


AssetsManager這個類爲我們提供了以上這些方法,下面對這些方法逐個進行簡單說明:

構造函數有三個參數:一個是zip下載地址,一個是版本文件網絡地址,一個是下載保存路徑。

checkStoragePath:檢查存儲路徑
checkUpdate:檢查更新,返回bool值
createDirectory:根據平臺創建目錄
deleteVersion:刪除本地版本
downLoad:下載文件
downloadAndUncompress:下載並解壓縮文件
getConnectionTimeout:獲得連接超時時間
getDelegate:獲得委託對象
getPackageUrl:獲得壓縮包地址
getStoragePath:獲得存儲地址
getVersion:獲得版本號
getVersionFileUrl:獲得版本文件地址
setConnectionTimeout:設置網絡連接超時
setDelegate:設置委託
setPackageUrl:設置包路徑
setSearchPath:設置優先資源搜索路徑
setStoragePath:設置存儲路徑
setVersionFileUrl:設置版本文件路徑
uncompress:解壓縮文件
update:更新



這裏還要介紹一個委託類:AssetsManagerDelegateProtocol,我們在實現下載更新時需要回調的三個方法:


讀者可以稍微研讀一下以上代碼,這裏Cocos2d-x只是給出一個簡單使用AssetsManager對程序進行熱更新的例子,但沒有提供完整的解決方案。後面筆者也會對Lua對Cocos2d-x客戶端進行熱更新這部分進行研究,有機會跟大家分享一下這方面的知識。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章