zoukankan      html  css  js  c++  java
  • Cocos2d-x 3.2 Lua演示样例 AssetsManagerTest(资源管理器)

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


  • 相关阅读:
    面经 收藏的 这可能不只是一篇面经
    2017网易秋招编程集合
    网易2017春招笔试真题编程题集合题解
    小朋友 排序
    网易编程题目 02 赶去公司
    网易有道2017内推选择题
    12,享元模式(Flyweight Pattern)是以共享的方式高效的支持大量的细粒度的对象。
    11,外观模式(Facade Pattern)是为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
    新手进行Oracle MIS系统开发的步骤
    Oracle常用查看表结构命令(一)
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6774321.html
Copyright © 2011-2022 走看看