(原创)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

原文地址:https://www.cnblogs.com/mingfuqishi/p/8145812.html

时间: 2024-08-29 18:57:13

(原创)cocos lua 热更新从零开始(一)最简单demo的相关文章

LUA --热更新

--什么是热更新? 游戏客户端启动时,主动请求服务端检查版本号,并更新资源到本地. 应用场景: 情况一:游戏客户端已经发布了,但突然发现有个比较严重的bug需要修复.这时需要更新游戏的代码(Lua代码). 情况二:情人节到了,需要搞个活动,在游戏中营造一个节日氛围.这时,需要更新游戏资源或增加一些功能. 好处:不需要重新打包和提交应用到市场等待审核. -- 热更新流程-->游戏启动-->检查版本 -->有版本更新-->初始化下载路径 -->设置搜索目录路径(优先搜索下载目录资

Cocos Creator 热更新文件MD5计算和需要注意的问题

Creator的热更新使用jsb.热更新基本按照 http://docs.cocos.com/creator/manual/zh/advanced-topics/hot-update.html?h=%E7%83%AD%E6%9B%B4%E6%96%B0这个官方教程, 以及https://github.com/cocos-creator/tutorial-hot-update这个官方示例就行.但是,有一些地方没有提及,这会导致热更出现的问题. 1.自己保存热更目录到localstorage,进入时

Cocos Creator热更新

一,添加热更新需要的文件 1. 在项目根目录添加 version_generator.js 文件   version_generator.js 内容如下: /** * 此模块用于热更新工程清单文件的生成 */ var fs = require('fs'); var path = require('path'); var crypto = require('crypto'); var manifest = { //服务器上资源文件存放路径(src,res的路径) packageUrl: 'http

cocos2dx lua 热更新方案的实现

(Upgrade.h) #include <stdio.h> #include "cocos2d.h" #include "framework/utils/Utils.h" #include "framework/json/JSONObject.h" USING_NS_CC; #include "ide-support/SimpleConfigParser.h" #include "extensions/

使用LUA 热更新模块

最近准备在手机项目客户端中使用lua, 以前一直在服务器使用luabind. 另外, tolua++也体验过, LuaPlus也在早年用过. 以下是本人对这些绑定库的个人感觉: luabind 利用boost机制把绑定做到极致, 比较适合主c++, 弱lua的脚本框架. 作者已经停止更新, 在windows/linux编译没问题, 但是在ios的LLVM下, 无法编译 tolua++ 像cocos2dx使用tolua++也是可以理解的, 那么多函数需要绑定, tolua++的头文件parse及自

cocos2dx 3.1.1 在线热更新 自动更新(使用AssetsManager更新游戏资源包)

为什么要在线更新资源和脚本文件? 简单概括,如果你的游戏项目已经在google play 或Apple Store 等平台上架了,那么当你项目需要做一些活动或者修改前端的一些代码等那么你需要重新提交一个新版本给平台.但是平台审核和具体的上架时间是个不确定的.具体什么时候能上架,主要由具体的平台决定. 如果游戏项目是使用脚本语言进行编写的(如lua.js),那么一旦需要更新,则可以通过从服务器下载最新的脚本和资源,从而跳过平台直接实现在线更新.(有些平台是禁止在线更新资源方式的,但是你懂得) 闲话

Unity热更新相关概念

热更新实现方式 1. 使用Lua脚本编写游戏逻辑(Lua调用C#的方式),Lua解析器(也叫Lua虚拟机)在运行时解析Lua脚本,无须编译 2. C#反射技术 3. C#Light(什么鬼?) 如何学习热更新 1. 学习Lua编程 关于uLua的学习,我们可以参考官网,以及官方bbs来学习.上面有详细的视频文字教程 官网:http://www.ulua.org/index.html 官方bbs:http://bbs.ulua.org/ 2. 使用LuaInterface.Luanet进行Lua和

客户端热更新框架之UI热更框架设计(下)

上一篇笔者介绍了关于什么是热更新,为什么需要热更新的技术文章.本篇就专门针对UI框架的热更新功能实现部分展开讨论,讨论的重点是热更新如何与UI框架进行结合? 现在笔者把设计“UI热更新框架”的整体设计与构建过程表述如下,最后附带源码工程的下载链接,供广大学员参考研究.如果大家有什么不明白的地方,欢迎大家在评论区进行讨论.   1:首先基于笔者以前设计的SUIFW 框架,做进一步功能完善.   完善UI框架对于复杂窗体的直接转向功能.为了小伙伴们能够更好的理解本技术,文章末尾特提供了下载链接供大家

node版本管理工具 nvm 热更新工具 nodemon

npm init -y 初始化 package.json nodemon xx文件或者服务 有热更新的作用 NVM简单使用(window版本)下载地址: https://github.com/coreybutler/nvm-windows (下载 nvm-setup.zip) nvm list // 查看nodejs版本列表 nvm install [node版本号] // 安装Nodejs nvm use [node版本号] // 切换nodejs版本 原文地址:https://www.cnb