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

(原创)cocoslua热更新从零开始(一)最简单demo

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

开发环境:WIN7 + cocos2dx 3.10 lua版本

0.学习这篇内容的基础是你要会创建并运行一个cocos lua项目

1.热更新的思想
所谓的热更新,就是在线更新代码和资源。
热更新的过程首先,客户端向服务器发送请求,服务器告诉客户端,没更新啦,你是最新的啦,那就直接跳过喽。但如果是告诉你有更新,那就要告诉我哪些需要更新对吧,你可能需要更新的东西,放在一个文件里,一并发送给客户端,客户端拿到这个文件,一个一个去向服务器要,最后把要更新的内容都下载到本地了。

2.热更新用到的类:
AssetsManagerEx

3.最简单的示例:
(1)把下面的完整代码复制到main.lua。
(2)先去cocos2dx3.10工程目录,把X:\cocos2d-x-3.10\build\Debug.win32\lua-tests\res\Manifests\AMTestScene1\project.manifest这个文件复制
到工程目录下的src/version/这里(version没有的话自己建一个文件夹)
(3)然后启动你的工程,就能更新到官方例子的资源了,资源下载路径在日志有显示(日志乱码的话,把main.lua高级保存为utf8-无签名)。

cc.FileUtils:getInstance():setPopupNotify(false)
cc.FileUtils:getInstance():addSearchPath("src/")
cc.FileUtils:getInstance():addSearchPath("res/")

require "config"
require "cocos.init"

local function main()
    print("开始启动程序")

    --初始界面
    local _Director = cc.Director:getInstance()
    local _Wide = display.width
    local _Hight = display.height
    
    local scene = cc.Scene:create()
    if _Director:getRunningScene() then
        _Director:replaceScene(scene)
    else
        _Director:runWithScene(scene)
    end

    local spHelloWorld = cc.Sprite:create("HelloWorld.png")
    spHelloWorld:setPosition(_Wide / 2, _Hight / 2)
    spHelloWorld:addTo(scene,9)

    local text = cc.Label:createWithSystemFont("Hello World", "Arial", 40)
    text:move(display.cx, display.cy + 200)
    text:addTo(scene,9)

    --更新完成后的界面
    local function run()
        print("启动完成")

        local bg = cc.Sprite:create("Images/Tranquil_Lagoon.jpg")
        bg:setPosition(_Wide / 2, _Hight / 2)
        bg:addTo(scene)

        text:setString("Hello World  更新完成")

    end

    --热更新开始
    local writablePath = cc.FileUtils:getInstance():getWritablePath()
    local storagePath = writablePath .. "new_version"
    --将下载目录的src和res作为优先级最高的搜索目录,这样才能保证下载的能覆盖原来的代码
    cc.FileUtils:getInstance():addSearchPath(storagePath.."/src/",true)
    cc.FileUtils:getInstance():addSearchPath(storagePath.."/res/",true)

    print("下载路径:"..storagePath)

    -- 创建AssetsManagerEx对象      --参数:本地project.manifest   下载保存路径
    local assetsManagerEx = cc.AssetsManagerEx:create("src/version/project.manifest", storagePath)
    assetsManagerEx:retain()


    -- 设置下载消息listener
    local function handleAssetsManagerEx(event)
        if (cc.EventAssetsManagerEx.EventCode.ALREADY_UP_TO_DATE == event:getEventCode()) then
            print("已经是最新版本了,进入游戏主界面")
            run()  
        end

        if (cc.EventAssetsManagerEx.EventCode.NEW_VERSION_FOUND == event:getEventCode()) then
            print("发现新版本,开始升级")
        end


        if (cc.EventAssetsManagerEx.EventCode.UPDATE_PROGRESSION == event:getEventCode()) then
            print("更新进度=" .. event:getPercent())
        end


        if (cc.EventAssetsManagerEx.EventCode.UPDATE_FINISHED == event:getEventCode()) then
            print("更新完毕,重新启动")
            run()
        end

        if (cc.EventAssetsManagerEx.EventCode.ERROR_NO_LOCAL_MANIFEST == event:getEventCode()) then
            print("发生错误:本地找不到manifest文件")
        end

        if (cc.EventAssetsManagerEx.EventCode.ERROR_DOWNLOAD_MANIFEST == event:getEventCode()) then
            print("发生错误:下载manifest文件失败")
        end

        if (cc.EventAssetsManagerEx.EventCode.ERROR_PARSE_MANIFEST == event:getEventCode()) then
            print("发生错误:解析manifest文件失败")
        end

        if (cc.EventAssetsManagerEx.EventCode.ERROR_UPDATING == event:getEventCode()) then
            print("发生错误:更新失败")
        end
    end

    --热更新事件
    local dispatcher = cc.Director:getInstance():getEventDispatcher()
    local eventListenerAssetsManagerEx = cc.EventListenerAssetsManagerEx:create(assetsManagerEx, handleAssetsManagerEx)
    dispatcher:addEventListenerWithFixedPriority(eventListenerAssetsManagerEx, 1)

    local localManifest = assetsManagerEx:getLocalManifest()
    print("当前版本:"..localManifest:getVersion())

    -- 检查版本并升级
    assetsManagerEx:update()
end

local status, msg = xpcall(main, __G__TRACKBACK__)
if not status then
    print(msg)
end

 


鲜花

握手

雷人

路过

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

请发表评论

全部评论

专题导读
上一篇:
PHP、Lua中的 尾调用发布时间:2022-07-22
下一篇:
xmake v2.5.8 发布,新增 Pascal/Swig 程序和 Lua53 运行时支持发布时间: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