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

48 篇文章 0 订阅
33 篇文章 0 订阅

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客户端进行热更新这部分进行研究,有机会跟大家分享一下这方面的知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值