(原創)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.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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM