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

Cocos2d-x 3.2 Lua演示样例 AssetsManagerTest(资源管理器)的更多相关文章

  1. Cocos2d-x 3.1.1 Lua演示样例 ActionManagerTest(动作管理)

    Cocos2d-x 3.1.1 Lua演示样例 ActionManagerTest(动作管理) 本篇博客介绍Cocos2d-x的动作管理样例,这个样例展示了Cocos2d-x的几个动作: MoveTo ...

  2. Cocos2d-x 3.1.1 Lua演示样例 ActionEaseTest(动作)

    Cocos2d-x Lua演示样例 ActionEaseTest(动作)   本篇博客介绍Cocos2d-x中的动作,Cocos2d-x为我们提供了丰富的动作接口,以下笔者就具体介绍一下:   本系列 ...

  3. Cocos2d-x 3.2 Lua演示样例 ClickAndMoveTest(点击移动測试)

    Cocos2d-x 3.2 Lua演示样例 ClickAndMoveTest(点击移动測试)  本篇博客介绍Cocos2d-x 3.2Lua演示样例中点击移动的样例,在这个样例你能够得到怎样创建单点触 ...

  4. Cocos2d-x 3.2 Lua演示样例 XMLHttpRequestTest(Http网络请求)

    Cocos2d-x 3.2 Lua演示样例 XMLHttpRequestTest(Http网络请求)     本篇博客介绍Cocos2d-x 3.2Lua演示样例中的XMLHttpRequestTes ...

  5. Cocos2d-x 3.1.1 Lua演示样例 ActionsProgressTest(进度条)

    Cocos2d-x 3.1.1 Lua演示样例 ActionsProgressTest(进度条) 本篇博客介绍Cocos2d-x中的进度条动画,进度条涉及以下几个重要的类和方法,笔者来给大家具体解说一 ...

  6. Cocos2d-x 3.2 Lua演示样例CurrentLanguageTest(当前语言环境)

    Cocos2d-x 3.2 Lua演示样例CurrentLanguageTest(当前语言环境) 转载请注明:IT_xiao小巫 本篇博客介绍Cocos2d-x 3.2给我们提供的一个样例.获取当前程 ...

  7. Cocos2d-x 3.2 Lua演示样例FontTest(字体測试)

    Cocos2d-x 3.2 Lua演示样例FontTest(字体測试) 本篇博客介绍Cocos2d-x 3.2中Lua測试项目中的FontTest样例,主要使用了字体文件来创建我们想要的字体样式: 第 ...

  8. Cocos2d-x-Lua演示样例项目HelloLua

    Cocos2d-x-Lua演示样例项目HelloLua 本篇博客介绍Cocos2d-x中Lua的实例项目,就是使用Cocos2d-x创建的初始项目执行所呈现的农场,这里笔者取名为HelloLua.本篇 ...

  9. Cocos2d-x 3.2Lua演示样例UserDefaultTest(用户默认配置)

    Cocos2d-x 3.2演示样例UserDefaultTest(用户默认配置) 本篇博客介绍Cocos2d-x 3.2演示样例中的UserDefaulstTest,我们在开发中可能须要用到一些默认配 ...

随机推荐

  1. java 接口 继承 接口 抽象类 继承 实体类

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 接口 可以 继承 接口 抽象类 可以 实现 接口 抽象类 继承实体类 需要 实体类 有 ...

  2. python3-开发进阶Flask的基础(2)

    知识回顾 1.django 和flask区别? 最大的不同就是django请求相关的数据,通过参数一个一个传递过去的,而flask就是先把放在某个地方,然后去取,这个东西叫上下文管理 2.什么是wsg ...

  3. poj 1743 后缀数组 求最长不重叠重复子串

    题意:有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题. “主题”是整个音符序列的一个子串,它需要满足如下条件:1 ...

  4. 【洛谷】P1176: 路径计数2【递推】

    P1176 路径计数2 题目描述 一个N×N的网格,你一开始在(1,1),即左上角.每次只能移动到下方相邻的格子或者右方相邻的格子,问到达(N,N),即右下角有多少种方法. 但是这个问题太简单了,所以 ...

  5. JDK源码(1.7) -- java.util.Queue<E>

    java.util.Queue<E> 源码分析(JDK1.7) -------------------------------------------------------------- ...

  6. PAT甲级1026. Table Tennis

    PAT甲级1026. Table Tennis 题意: 乒乓球俱乐部有N张桌子供公众使用.表的编号从1到N.对于任何一对玩家,如果有一些表在到达时打开,它们将被分配给具有最小数字的可用表.如果所有的表 ...

  7. PAT甲级1017. Queueing at Bank

    PAT甲级1017. Queueing at Bank 题意: 假设一家银行有K台开放服务.窗前有一条黄线,将等候区分为两部分.所有的客户都必须在黄线后面排队,直到他/她轮到服务,并有一个可用的窗口. ...

  8. Extjs window组件 拖动统制

    Extjs window组件 拖动控制有时候一拖就拖出了浏览器,在想拖回来就不好办了: 解决办法:参考以下代码,在加载Ext核心库以后执行: Ext.override(Ext.Window, {    ...

  9. IOS定位核心与地图

    IOS定位核心与地图                 Core Location以及Map框架包通常能给我们的应用程序添加定位和地图相关的服务.Core Location框架包通常是使用硬件设备来进行 ...

  10. 【转】2012年7月9 – 知名网页游戏公司 PHP高级工程师 最新面试题

    开头先唠叨两句,今天下午,上海的天热的让人窒息啊.Google下地图,好远!要做公交,想想就是人挤人.咬了下牙,打的,尼玛百来块啊,有木有!麻麻的,更让我萌生买车的决心了. 到了公司,环境不错.前台拿 ...