zoukankan      html  css  js  c++  java
  • (原创)cocos lua 热更新从零开始(一)最简单demo

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

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

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

    2.热更新用到的类:
    AssetsManagerEx

    3.最简单的示例:
    (1)把下面的完整代码复制到main.lua。
    (2)先去cocos2dx3.10工程目录,把X:cocos2d-x-3.10uildDebug.win32lua-tests esManifestsAMTestScene1project.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
  • 相关阅读:
    Expert C programming书摘
    修改文件时间属性的方法
    算法学习, 开始计划
    小游戏学习搜集
    C++ 练习记录2---Effective STL中的vector<bool>
    C++ 练习记录1--vector<T> 中T的初始化
    oracle的wm_concat函数实现行转列
    Oracle批量插入有日期类型数据
    如何将zTree选中节点传递给后台
    第五章:1.数组和广义表 -- 数组
  • 原文地址:https://www.cnblogs.com/mingfuqishi/p/8145812.html
Copyright © 2011-2022 走看看