• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Cocos2d-x3.2Lua演示样例AssetsManagerTest(资源管理器)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
Cocos2d-x 3.2 Lua演示样例 AssetsManagerTest(资源管理器)

本篇博客介绍Cocos2d-x 为我们提供的一个类——AssetsManager在Lua中的使用样例,效果例如以下图:




Cocos2d-x 给出的样例是AssetsManagerTest,进入会发现三个菜单项:
  • enter
  • reset
  • update
enter是进入场景,reset是删除本地版本号,又一次设置,update就是更新资源文件。



笔者使用LDT打开lua-tests測试项目:



在src文件夹下找到AssetsManagerTest文件夹,查看下面代码(笔者对其进行了凝视):
>>>AsetsManagerModule.lua
--[[
资源管理器模块
]]--
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)
        -- 假设更新button没有被点击
        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

下面这张图截自官网:


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



鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Lua表的构造及遍历发布时间:2022-07-22
下一篇:
C++与Lua交互(三)发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap