https://blog.csdn.net/wwj_748/article/details/38368061
- enter
- reset
- update
- --[[
- 資源管理器模塊
- ]]--
- local AssetManagerModule = {}
- --[[
- newScene
- ]]--
- function AssetManagerModule.newScene(backfunc)
- -- 獲取屏幕大小
- local winSize = cc.Director:getInstance():getWinSize()
- -- 創建新的場景
- local newScene = cc.Scene:create()
- -- 創建新的層
- local layer = cc.Layer:create()
- -- 後臺更新
- local function backToUpdate()
- local scene = backfunc()
- if scene ~= nil then
- cc.Director:getInstance():replaceScene(scene)
- end
- end
- -- 創建回退菜單
- cc.MenuItemFont:setFontName("Arial")
- cc.MenuItemFont:setFontSize(24)
- local backMenuItem = cc.MenuItemFont:create("Back")
- -- 放置在右下角大致的位置
- backMenuItem:setPosition(cc.p(VisibleRect:rightBottom().x - 50, VisibleRect:rightBottom().y + 25))
- -- 註冊監聽方法
- backMenuItem:registerScriptTapHandler(backToUpdate)
- -- 創建菜單
- local backMenu = cc.Menu:create()
- backMenu:setPosition(0, 0)
- backMenu:addChild(backMenuItem)
- layer:addChild(backMenu,6)
- -- 創建標籤
- local helloLabel = cc.Label:createWithTTF("Hello World", s_arialPath, 38)
- helloLabel:setAnchorPoint(cc.p(0.5, 0.5))-- 錨點居中
- helloLabel:setPosition(cc.p(winSize.width / 2, winSize.height - 40))
- layer:addChild(helloLabel, 5)
- -- 創建精靈,這裏是一張背景圖
- local sprite = cc.Sprite:create("Images/background.png")
- sprite:setAnchorPoint(cc.p(0.5, 0.5))-- 錨點居中
- sprite:setPosition(cc.p(winSize.width / 2, winSize.height / 2))
- layer:addChild(sprite, 0)
- newScene:addChild(layer)-- 添加到場景
- cc.Director:getInstance():replaceScene(newScene)-- 替換場景
- end
- -- 返回模塊
- return AssetManagerModule
>>>AssetsManagerTest.lua
- -- 獲取目標平臺
- local targetPlatform = cc.Application:getInstance():getTargetPlatform()
- local lineSpace = 40 -- 行間距
- local itemTagBasic = 1000
- local menuItemNames =
- {
- "enter",
- "reset",
- "update",
- }
- -- 獲取屏幕大小
- local winSize = cc.Director:getInstance():getWinSize()
- -- 更新層
- local function updateLayer()
- -- 首先創建一個層
- local layer = cc.Layer:create()
- local support = false
- -- 判斷是否支持iphone、ipad、win32、android或者mac
- if (cc.PLATFORM_OS_IPHONE == targetPlatform) or (cc.PLATFORM_OS_IPAD == targetPlatform)
- or (cc.PLATFORM_OS_WINDOWS == targetPlatform) or (cc.PLATFORM_OS_ANDROID == targetPlatform)
- or (cc.PLATFORM_OS_MAC == targetPlatform) then
- support = true
- end
- -- 如果不支持平臺
- if not support then
- print("Platform is not supported!")
- return layer
- end
- local isUpdateItemClicked = false -- 是否更新項被點擊
- local assetsManager = nil -- 資源管理器對象
- local pathToSave = "" -- 保存路徑
- local menu = cc.Menu:create() -- 菜單
- menu:setPosition(cc.p(0, 0)) -- 設置菜單位置
- cc.MenuItemFont:setFontName("Arial")-- 設置菜單字體樣式
- cc.MenuItemFont:setFontSize(24) -- 設置字體大小
- -- 用於更新的標籤
- local progressLable = cc.Label:createWithTTF("",s_arialPath,30)
- progressLable:setAnchorPoint(cc.p(0.5, 0.5))
- progressLable:setPosition(cc.p(140,50))
- layer:addChild(progressLable)
- -- 下載目錄
- pathToSave = createDownloadDir()
- -- 下載錯誤回調
- local function onError(errorCode)
- -- 沒有新版本
- if errorCode == cc.ASSETSMANAGER_NO_NEW_VERSION then
- progressLable:setString("no new version")
- elseif errorCode == cc.ASSETSMANAGER_NETWORK then
- -- 網絡錯誤
- progressLable:setString("network error")
- end
- end
- -- 進度更新回調
- local function onProgress( percent )
- -- 顯示下載進度
- local progress = string.format("downloading %d%%",percent)
- progressLable:setString(progress)
- end
- -- 下載成功方法回調
- local function onSuccess()
- progressLable:setString("downloading ok")
- end
- -- 獲得資源管理器
- local function getAssetsManager()
- if nil == assetsManager then
- -- 創建一個資源管理器,第一個參數是zip包下載地址,第二個參數是版本文件,第三個參數是保存路徑
- assetsManager = cc.AssetsManager:new("https://raw.github.com/samuele3hu/AssetsManagerTest/master/package.zip",
- "https://raw.github.com/samuele3hu/AssetsManagerTest/master/version",
- pathToSave)
- -- 保留所有權,該方法會增加Ref對象的引用計數
- assetsManager:retain()
- -- 設置一系列委託
- assetsManager:setDelegate(onError, cc.ASSETSMANAGER_PROTOCOL_ERROR )
- assetsManager:setDelegate(onProgress, cc.ASSETSMANAGER_PROTOCOL_PROGRESS)
- assetsManager:setDelegate(onSuccess, cc.ASSETSMANAGER_PROTOCOL_SUCCESS )
- assetsManager:setConnectionTimeout(3)-- 設置連接超時
- end
- return assetsManager
- end
- -- 更新
- local function update(sender)
- progressLable:setString("")
- -- 調用AssetsManager的update方法
- getAssetsManager():update()
- end
- -- 重設
- local function reset(sender)
- progressLable:setString("")
- -- 刪除下載路徑
- deleteDownloadDir(pathToSave)
- -- 刪除版本
- getAssetsManager():deleteVersion()
- -- 創建下載路徑
- createDownloadDir()
- end
- -- 重新加載模塊
- local function reloadModule( moduleName )
- package.loaded[moduleName] = nil
- return require(moduleName)
- end
- -- 進入
- local function enter(sender)
- -- 如果更新按鈕沒有被點擊
- if not isUpdateItemClicked then
- local realPath = pathToSave .. "/package"
- addSearchPath(realPath,true)
- end
- -- 重新加載模塊
- assetsManagerModule = reloadModule("src/AssetsManagerTest/AssetsManagerModule")
- assetsManagerModule.newScene(AssetsManagerTestMain)
- end
- -- 回調方法
- local callbackFuncs =
- {
- enter,
- reset,
- update,
- }
- -- 菜單回調方法
- local function menuCallback(tag, menuItem)
- local scene = nil
- local nIdx = menuItem:getLocalZOrder() - itemTagBasic
- local ExtensionsTestScene = CreateExtensionsTestScene(nIdx)
- if nil ~= ExtensionsTestScene then
- cc.Director:getInstance():replaceScene(ExtensionsTestScene)
- end
- end
- -- 遍歷添加三個菜單項
- for i = 1, table.getn(menuItemNames) do
- local item = cc.MenuItemFont:create(menuItemNames[i])
- item:registerScriptTapHandler(callbackFuncs[i])-- 註冊點擊回調地址
- -- 設置三個菜單的位置
- item:setPosition(winSize.width / 2, winSize.height - i * lineSpace)
- if not support then
- item:setEnabled(false)
- end
- menu:addChild(item, itemTagBasic + i)
- end
- local function onNodeEvent(msgName)
- if nil ~= assetsManager then
- -- 釋放資源
- assetsManager:release()
- assetsManager = nil
- end
- end
- -- 註冊層的點擊回調方法
- layer:registerScriptHandler(onNodeEvent)
- layer:addChild(menu)
- return layer
- end
- -------------------------------------
- -- AssetsManager Test
- -------------------------------------
- function AssetsManagerTestMain()
- local scene = cc.Scene:create()
- scene:addChild(updateLayer())
- scene:addChild(CreateBackMenuItem())
- return scene
- end
讀者可以稍微研讀一下以上代碼,這裏Cocos2d-x只是給出一個簡單使用AssetsManager對程序進行熱更新的例子,但沒有提供完整的解決方案。後面筆者也會對Lua對Cocos2d-x客戶端進行熱更新這部分進行研究,有機會跟大家分享一下這方面的知識。