`
weiyinchao88
  • 浏览: 1234349 次
文章分类
社区版块
存档分类
最新评论

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)
        -- 如果更新按钮没有被点击
        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-x客户端进行热更新这部分进行研究,有机会跟大家分享一下这方面的知识。

分享到:
评论

相关推荐

    Cocos2d-x实战_Lua卷 _第2版

    《Cocos2d-x实战_Lua卷_第2版》是一本专为游戏开发者准备的指南,主要聚焦于使用Cocos2d-x框架与Lua语言进行游戏开发。Cocos2d-x是一个开源的游戏开发框架,它允许开发者用C++、Lua或者JavaScript编写游戏,并且可以...

    cocos2d-x+lua游戏demo源码

    【cocos2d-x+lua游戏demo源码】是一个基于cocos2d-x游戏引擎和lua脚本语言的游戏示例项目。cocos2d-x是一个跨平台的2D游戏开发框架,广泛应用于移动设备,如iOS和Android。lua是一种轻量级的、面向过程的编程语言,...

    cocos2D-lua 核心编程内置代码

    在“Cocos2d-x之Lua核心编程(第二版)_配套代码”中,我们可以找到一系列的示例和代码,这些代码涵盖了Cocos2d-lua的核心功能和编程技巧。 一、Cocos2d-lua简介 Cocos2d-lua是Cocos2d-x的一个扩展,它允许开发者使用...

    关东升_Cocos2d-x实战 Lua卷

    根据提供的文件标题、描述、标签以及部分内容,我们可以总结出与“关东升_Cocos2d-x实战 Lua卷”相关的IT知识点。以下是对这些知识点的详细阐述: ### 关于《Cocos2d-x实战 Lua卷》 #### 1. Cocos2d-x简介 Cocos2d...

    cocos2d-x 动画工具 Flash2Cocos2d-x 1.3

    在压缩包文件"jyinkailej-Flash2Cocos2d-x-8c0deff"中,可能包含了Flash2Cocos2d-x工具的源码、文档、示例项目和其他相关资源,供开发者学习和使用。这些资源可以帮助开发者深入理解如何使用该工具,并进行实际的...

    cocos2d-x-3.2.zip

    《cocos2d-x 3.2:经典游戏开发框架深度解析》 cocos2d-x 是一个跨平台的游戏开发框架,它基于C++,同时提供了Lua和JavaScript的绑定,让开发者可以方便地在多种操作系统上创建2D游戏、演示程序和其他图形/交互式...

    Cocos2d-x实战C++卷关东升著完整版pdf

    同时,音效和音乐管理也是游戏体验的重要组成部分,书中会介绍如何使用Cocos2d-x的音频API来播放和控制音频资源。 在实际项目开发中,内存管理和性能优化是关键。本书可能会详细讲解Cocos2d-x中的内存管理机制,如...

    Cocos2d-x实战 JS卷 Cocos2d-JS开发

    1. **Cocos2d-x入门**:介绍Cocos2d-x的基本架构,包括场景(Scene)、层(Layer)、节点(Node)等概念,以及如何设置项目环境,创建和管理游戏资源。 2. **图形与动画**:讲解如何使用Cocos2d-x的绘图API绘制2D...

    cocos2d-x与lua

    知识点一:cocos2d-x与Lua脚本结合的优势 在游戏开发领域,cocos2d-x是一个跨平台的游戏开发框架,支持多语言开发,包括C++和Lua等。Lua作为一种轻量级的脚本语言,以其简洁易懂、运行效率高、跨平台能力强、易于...

    cocos2dx lua核心编程(第二版)配套代码

    《Cocos2d-x之Lua核心编程(第二版)》配套代码是一份极其重要的学习资源,旨在帮助开发者深入理解和熟练运用Cocos2d-x游戏引擎与Lua语言进行游戏开发。Cocos2d-x是一个跨平台的游戏开发框架,而Lua则是一种轻量级的...

    Cocos2d-x学习笔记

    - 理解资源管理:在Cocos2d-x中,资源管理是开发过程中的重要一环,要学习如何加载、缓存和清理游戏资源。 - 学习渲染流程:Cocos2d-x使用OpenGL作为渲染接口,初学者需要学习OpenGL基础以及Cocos2d-x中的渲染流程和...

    cocos2d-x 案例开发大全 第二章(源码)

    《cocos2d-x案例开发大全》第二章的源码主要涵盖了使用cocos2d-x进行游戏开发的各种实践技巧和示例。cocos2d-x是一个开源的游戏开发框架,基于C++,支持跨平台,包括iOS、Android、Windows等多个操作系统。本章的...

    Cocos2d-x实战++Lua卷.pdf

    根据提供的文件信息,本文将重点围绕“Cocos2d-x实战++Lua卷”这一主题进行深入探讨,并结合描述部分给出的知识点,详细阐述Cocos2d-x与Lua在游戏开发中的应用。 ### Cocos2d-x简介 Cocos2d-x是一款开源的游戏引擎...

    cocos2d-lua整合到ios工程.zip

    这个过程涉及到了Xcode项目的配置、Cocos2d-x和Lua的集成、原生代码与Lua的交互,以及资源的管理等多个方面。通过学习和实践这个示例,开发者可以更好地理解和掌握Cocos2d-lua在iOS平台上的应用。

    Cocos2d-x demo程序

    8. **资源管理**:Cocos2d-x 提供了纹理、字体、音频等资源的加载和管理机制。在压缩包中的"cocos2dgame.txt"可能是资源列表或配置文件,详细列出了项目中使用的各种资源。 9. **性能优化**:Cocos2d-x 提供了一些...

    cocos2d-1.0.1-x-0.10.0

    5. **资源管理**:Cocos2d-x 包含了图片、音频、字体等资源的加载和管理功能,简化了资源的生命周期管理。 6. **性能优化**:通过纹理 atlases 和批处理技术,提高了图像渲染的效率,减少了内存占用。 7. **脚本...

    cocos2d-x 3.x游戏开发实战光盘

    《cocos2d-x 3.x游戏开发实战光盘》是一个深入探讨cocos2d-x 3.x游戏引擎开发的资源集合,旨在帮助开发者通过实际案例掌握这一强大的2D游戏开发工具。cocos2d-x是一款开源的游戏开发框架,基于C++,广泛应用于跨平台...

    瘸腿蛤蟆笔记39-cocos2d-x-3.2 Box2d物理引擎自由落体代码

    在本篇中,我们将深入探讨使用Cocos2d-x 3.2框架集成Box2D物理引擎实现自由落体效果的编程技术。Cocos2d-x是一个广泛使用的开源游戏开发框架,它支持多种平台,包括iOS、Android以及桌面系统。Box2D是一个强大的2D...

    Cocos2d-X游戏源码大合集.rar

    Cocos2d-X支持iOS、Android、Windows、Mac等多个平台,源码集合可能包含针对不同平台的适配和优化示例,这对于希望开发多平台游戏的开发者来说是宝贵的资源。 3. **游戏实例**: - **SY-022**:可能代表不同的...

    Cocos2d-x实战:Lua卷(第2版)书籍代码

    这是书籍 Cocos2d-x实战:Lua卷(第2版)的代码,关东升老师的,这里分享出来。除了章节的小示例代码外,还有一个《迷失航线》的游戏示例代码。这是一个下载地址。

Global site tag (gtag.js) - Google Analytics