cocos2dx lua 热更新

转载 2015年11月20日 16:06:27
最近研究cocos2dx + lua 实现游戏的热更新。基本原理:比如我有一个GameScene,显示"hello world",现在热更新,更新之后显示"hello SB".如果是用c++来开发,那么只用把它作成lib库,更新时替换lib库。用lua的话,更简单,替换相关的lua就可以了。
GameScene.lua
  1. require "Cocos2d"  
  2. require "Cocos2dConstants"  
  3.   
  4. local GameScene = class("GameScene",function()  
  5.     return cc.Scene:create()  
  6. end)  
  7.   
  8. function GameScene.create()  
  9.     local scene = GameScene.new()  
  10.     scene:addChild(scene:createTitle())      
  11.     return scene  
  12. end  
  13.   
  14.   
  15. function GameScene:ctor()  
  16.     self.visibleSize = cc.Director:getInstance():getVisibleSize()  
  17.     self.origin = cc.Director:getInstance():getVisibleOrigin()  
  18.     self.schedulerID = nil  
  19. end  
  20.   
  21. function GameScene:createTitle()  
  22.     local title = cc.Label:createWithTTF("Hello World","fonts/arial.ttf",24)  
  23.     title:setPosition(self.visibleSize.width /2,self.visibleSize.height /2)  
  24.       
  25.     return title  
  26. end  

更新的GameScene.lua
  1. require "Cocos2d"  
  2. require "Cocos2dConstants"  
  3.   
  4. local GameScene = class("GameScene",function()  
  5.     return cc.Scene:create()  
  6. end)  
  7.   
  8. function GameScene.create()  
  9.     local scene = GameScene.new()  
  10.     scene:addChild(scene:createTitle())     
  11.     return scene  
  12. end  
  13.   
  14.   
  15. function GameScene:ctor()  
  16.     self.visibleSize = cc.Director:getInstance():getVisibleSize()  
  17.     self.origin = cc.Director:getInstance():getVisibleOrigin()  
  18.     self.schedulerID = nil  
  19. end  
  20.   
  21. function GameScene:createTitle()  
  22.     local title = cc.Label:createWithTTF("Hello SB","fonts/arial.ttf",24)  
  23.     title:setPosition(self.visibleSize.width /2,self.visibleSize.height /2)  
  24.       
  25.     return title  
  26. end  
最关键的更新模块,MenuScene.lua
  1. require "Cocos2d"  
  2. require "Cocos2dConstants"  
  3.   
  4. local MenuScene = class("MenuScene",function()  
  5.     return cc.Scene:create()  
  6. end)  
  7.   
  8. local title  
  9.   
  10. function MenuScene.create()  
  11.     local scene = MenuScene.new()  
  12.     scene:addChild(scene:createLayer())  
  13.     --scene:addChild(scene:createLayerFarm())  
  14.     --scene:addChild(scene:createLayerMenu())  
  15.     return scene  
  16. end  
  17.   
  18. function MenuScene:ctor()  
  19.     self.visibleSize = cc.Director:getInstance():getVisibleSize()  
  20.     self.origin = cc.Director:getInstance():getVisibleOrigin()  
  21.     self.schedulerID = nil  
  22. end  
  23.   
  24.   
  25.   
  26. function MenuScene:createLayer()  
  27.   
  28.     function menuCallback1(tag)          
  29.         local scene = require("GameScene")  
  30.         local gameScene = scene.create()  
  31.         cc.Director:getInstance():replaceScene(gameScene)          
  32.     end  
  33.       
  34.     function menuCallback2(tag)  
  35.         MenuScene:update()         
  36.     end  
  37.       
  38.     local menuLayer = cc.Layer:create()  
  39.     title = cc.Label:createWithTTF("Choose Scene","fonts/arial.ttf",24)  
  40.     title:setPosition(self.visibleSize.width /2,self.visibleSize.height /4 * 3)  
  41.     menuLayer:addChild(title)      
  42.       
  43.     local menuLabel1 = cc.Label:createWithTTF("Go to Scene""fonts/arial.ttf", 24)      
  44.     local menuItem1 = cc.MenuItemLabel:create(menuLabel1)  
  45.     menuItem1:registerScriptTapHandler(menuCallback1)  
  46.     menuItem1:setPosition(self.visibleSize.width /2,self.visibleSize.height /4 * 2)  
  47.       
  48.       
  49.     local menuLabel2 = cc.Label:createWithTTF("Update""fonts/arial.ttf", 24)      
  50.     local menuItem2 = cc.MenuItemLabel:create(menuLabel2)  
  51.     menuItem2:registerScriptTapHandler(menuCallback2)  
  52.     menuItem2:setPosition(self.visibleSize.width /2,self.visibleSize.height /4 * 1)  
  53.       
  54.     local MainMenu = cc.Menu:create()  
  55.     MainMenu:setPosition(0,0)  
  56.     MainMenu:addChild(menuItem1)  
  57.     MainMenu:addChild(menuItem2)  
  58.     menuLayer:addChild(MainMenu)   
  59.     
  60.     return menuLayer      
  61. end  
  62.   
  63. function MenuScene:getAssetsManager()  
  64.     local function onError(errorCode)  
  65.         if errorCode == cc.ASSETSMANAGER_NO_NEW_VERSION then  
  66.             title:setString("no new version")  
  67.         elseif errorCode == cc.ASSETSMANAGER_NETWORK then  
  68.             title:setString("network error")  
  69.         end  
  70.     end  
  71.   
  72.     local function onProgress( percent )  
  73.         local progress = string.format("downloading %d%%",percent)  
  74.         title:setString(progress)  
  75.     end  
  76.   
  77.     local function onSuccess()  
  78.         title:setString("downloading ok")  
  79.     end  
  80.   
  81.     local pathToSave          = ""  
  82.     pathToSave = createDownloadDir()    
  83.       
  84.     local assetsManager = cc.AssetsManager:new("http://qd.baidupcs.com/file/1a531cc6565d95827e0ec3f9fd4af795?fid=138463011-250528-222085911919595&time=1406097600&sign=FDTAXER-DCb740ccc5511e5e8fedcff06b081203-mLvWIkhwaVZCjN%2BpTYZJZ%2BagPR4%3D&to=qb&fm=N,B,T,t&newver=1&expires=1406098200&rt=sh&r=164813188&mlogid=124796854&sh=1&vuk=138463011&vbdid=2986594979&fn=GameScene.zip",  
  85.         "https://raw.github.com/samuele3hu/AssetsManagerTest/master/version",  
  86.         pathToSave)  
  87.     assetsManager:retain()  
  88.     assetsManager:setDelegate(onError, cc.ASSETSMANAGER_PROTOCOL_ERROR )  
  89.     assetsManager:setDelegate(onProgress, cc.ASSETSMANAGER_PROTOCOL_PROGRESS)  
  90.     assetsManager:setDelegate(onSuccess, cc.ASSETSMANAGER_PROTOCOL_SUCCESS )  
  91.     assetsManager:setConnectionTimeout(3)   
  92.     return assetsManager  
  93. end  
  94.   
  95. function MenuScene:update()  
  96.     MenuScene:getAssetsManager():update()      
  97. end  
  98.   
  99. return MenuScene  
关键看cc.AssertsMananger。cpp在extensions\assets-manager。
AssetsManager传三个参数,resource.zip路径,version路径,写文件的路径。
然后调用AssetsManager.update,进行下载更新。

注意的是,android时,它是写到Context.getCacheDir()里。所以每次进入游戏时,都会重新更新。需要修改createDownloadDir()里创建的路径,把它写到sd卡上。

Cocos2dx Lua 热更新

在我没接触热更新之前,我对热更新是一脸懵逼。后来看了些资料,自己动手试验了下,基本上了解了它的过程。 所谓的热更新,就是在线更新代码和资源。 热更新的过程 首先,客户端向服务器发送请...
  • u010693827
  • u010693827
  • 2017年02月13日 13:55
  • 2111

cocos2dx lua 热更新

cocos2dx lua 热更新 最近研究cocos2dx +
  • cloud95
  • cloud95
  • 2014年07月23日 15:58
  • 18253

cocos2dx-lua 3.x 热更新方法

cocos2dx-lua中有assetmanagerex的c++实现类,也有绑定到lua。不过在3.10之前有缺陷,问题是当有文件下载失败时会陷入死循环,导致业务链断裂。不过网上有解决办法,可简单修改...
  • keven418440201
  • keven418440201
  • 2016年11月24日 18:25
  • 3936

5------Cocos2dx-- 资源热更新(lua)

前言:游戏上线后,我们常常还会需要更新,如新增玩法,活动等,这种动态的更新资源我们称为游戏的热更新。热更新一般只适用于脚本语言,因为脚本不需要编译,是一种解释性语言,而如C++语言是很难热更新的,其代...
  • u014780084
  • u014780084
  • 2016年06月24日 17:08
  • 999

cocos2dx-lua_热更新_官方示例_AssetsManagerExTest

以下是Cocos2dx3.10的测试实例 AssetsManagerExTest 的分析 1.客户端的文件结构 pjmj-- --res   --fonts     --Marker...
  • haibo19981
  • haibo19981
  • 2016年07月12日 18:06
  • 2178

lua热更新基础之zip解压(杜甲同学DJZipAchive解压缩)

http://blog.csdn.net/qqmcy/article/details/24932765
  • themagickeyjianan
  • themagickeyjianan
  • 2016年11月18日 16:34
  • 282

cocos2d-x lua热更新问题,重载reload

1、什么是热更新? 热更新也叫不停机更新,是在游戏服务器运行期间对游戏进行更新。实现不停机修正bug、修改游戏数据等操作。也可以这样讲:一辆车以时速150km跑着,突然爆胎了,然后司机告诉你,我...
  • qq_37508511
  • qq_37508511
  • 2017年09月06日 16:02
  • 287

【cocos2d-x 3.5】简单Lua 热更新

local title = root:getChildByName("Text") local function onError(errorCode) if errorCode == cc....
  • slow_liao
  • slow_liao
  • 2015年05月19日 21:49
  • 4096

使用LUA 热更新模块

最近准备在手机项目客户端中使用lua, 以前一直在服务器使用luabind. 另外, tolua++也体验过, LuaPlus也在早年用过. 以下是本人对这些绑定库的个人感觉: luabind 利...
  • Kaitiren
  • Kaitiren
  • 2015年01月08日 14:08
  • 2152

cocos lua 实现热更新

第一次搞热更新,这里记录一下全过程,方面以后查看。 原理:每次登陆游戏利用cocos的assetManager从服务器拉去当前最新的两个文件。 一个是version.mainifest,一个proje...
  • u011488256
  • u011488256
  • 2016年08月22日 10:51
  • 3264
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos2dx lua 热更新
举报原因:
原因补充:

(最多只允许输入30个字)