(原创)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 / , _Hight / )
spHelloWorld:addTo(scene,) local text = cc.Label:createWithSystemFont("Hello World", "Arial", )
text:move(display.cx, display.cy + )
text:addTo(scene,) --更新完成后的界面
local function run()
print("启动完成") local bg = cc.Sprite:create("Images/Tranquil_Lagoon.jpg")
bg:setPosition(_Wide / , _Hight / )
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, ) local localManifest = assetsManagerEx:getLocalManifest()
print("当前版本:"..localManifest:getVersion()) -- 检查版本并升级
assetsManagerEx:update()
end local status, msg = xpcall(main, __G__TRACKBACK__)
if not status then
print(msg)
end
(原创)cocos lua 热更新从零开始(一)最简单demo的更多相关文章
- Lua热更新时正确设置文件名
Lua热更新时正确设置文件名(金庆的专栏 2016.12)Lua热更新模块见:https://github.com/jinq0123/hotfix其中使用 load(chunk) 来加载更新后的内容, ...
- Lua热更新(hotfix)
Lua热更新(hotfix)(金庆的专栏)hotfixLua 5.2/5.3 hotfix. Hot update functions and keep old data.https://github ...
- 出售一套Unity + Lua热更新框架代码
出售一套Unity + Lua的客户端框架代码,功能有资源管理.网络通信.配置文件解析.热更新.文件读写.Lua加密揭秘.UI框架.打包工具.编辑器工具等,已经在多个实际项目(已上线)中使用.代码优雅 ...
- cocos creator热更新教程
1.下载HotUpdate热更新DEMO 2.在cocos creator中下载热更新插件,cocos creator版本要在1.7及以上版本 3.插件默认安装在C:\Users\Administra ...
- Cocos Creator 热更新文件MD5计算和需要注意的问题
Creator的热更新使用jsb.热更新基本按照 http://docs.cocos.com/creator/manual/zh/advanced-topics/hot-update.html?h=% ...
- cocos2dx lua 热更新方案的实现
(Upgrade.h) #include <stdio.h> #include "cocos2d.h" #include "framework/utils/U ...
- 腾讯开源手游热更新方案,Unity3D下的Lua编程
原文:http://www.sohu.com/a/123334175_355140 作者|车雄生 编辑|木环 腾讯最近在开源方面的动作不断:先是微信跨平台基础组件Mars宣布开源,腾讯手游又于近期开源 ...
- 手游为什么要热更新,C#为什么不能热更新,LUA为什么可以
热更新是什么?简单的说就是打补丁,只补需要部分,不用重个游戏包重打上传 热更新问题的本质是代码更新而不是资源更新,为什么呢? 大型手游都是将补丁资源放在专门的WEB服务器上,游戏启动时动态下载并放入到 ...
- 另类Unity热更新大法:代码注入式补丁热更新
对老项目进行热更新 项目用纯C#开发的? 眼看Unity引擎热火朝天,无数程序猿加入到了Unity开发的大本营. 一些老项目,在当时ulua/slua还不如今天那样的成熟,因此他们选择了全c#开发:也 ...
随机推荐
- openstack安装过程遇到的问题
1.安装openstack官方源无法使用,使用阿里云的openstack源O版源 ##cat openstack-ocata.repo [openstack-ocata] name=openstac ...
- 布局无法发送,布局发布状态停留在“Transferring”,进度停留在 0%
按顺序检查如下: 1. 检查Player是否在线?不在线则无法发送任何内容,进度会停留在0%,待Player下次在线时,任务自动开始传输. Player在线,Messenger上可以看到Player名 ...
- 让多个HTML页面 使用 同一段HTML代码
需求背景 一个网站有多个网页:一个网页,可以分为很多部分,举个例子,下面是一个特别简单的网页结构: 一般情况下,footer都是用于标识网站的相关信息(备案.联系方式.制作方),每一个页面都是相 ...
- python语法与c++不同点
代码结构由':'号和缩进 来标示. 函数: def 定义 不定参数: *args: tarple可逐个传, 整体传, *拆包传 **kwargs dict可逐个传, 整体传, ** 拆包传, 有2 ...
- PhotoShop不用魔棒、钢笔 建立较平整的选区 P进电脑屏幕里
不用魔棒.抽出.钢笔等,还可以直接变形图建立调整选区,这种方法比钢笔抽出感觉简单一些,比魔棒仔细一些. 抽出或钢笔:抽出弄错了偏移了还要擦除,调整笔刷,抽出后可能还有毛边,需要用橡皮擦除: 钢笔,错了 ...
- 利用window.performance.timing进行性能分析
性能分析... window.performance.timing中相关属性语义: // .navigationStart 准备加载页面的起始时间 // .unloadEventStart 如果前一个 ...
- Redis DeskTop Manager 使用教程
redis desktop manager windows 是一款能够跨平台使用的开源性redis可视化工具. redis desktop manager主要针对redis开发设计,拥有直观强大的可视 ...
- edusoho -A5: ApiBundle UML
edusoho -A5: ApiBundle UML
- Help Me Escape ZOJ - 3640
Background If thou doest well, shalt thou not be accepted? and if thou doest not well, sin lieth ...
- B-树(B树)详解
具体讲解之前,有一点,再次强调下:B-树,即为B树.因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解.如人们可能会以为B-树 ...