quick-cocos2d-x的热更新机制实现<四>update包(lua)(中)

原文地址:http://www.cocoachina.com/bbs/read.php?tid=213061

4.4 update.updateScene


这个模块用于显示更新过程的进度和一些信息。所有内容如下:


复制代码
  1. ------
  2. -- updateScene for update package.
  3. -- This is a object, not a class.
  4. -- In this scene, it will show download progress bar
  5. -- and state for uncompress.
  6. -- @author zrong(zengrong.net)
  7. -- Creation: 2014-07-03
  8. local updater = require("update.updater")
  9. local sharedDirector         = CCDirector:sharedDirector()
  10. -- check device screen size
  11. local glview = sharedDirector:getOpenGLView()
  12. local size = glview:getFrameSize()
  13. local display = {}
  14. display.sizeInPixels = {width = size.width, height = size.height}
  15. local w = display.sizeInPixels.width
  16. local h = display.sizeInPixels.height
  17. CONFIG_SCREEN_WIDTH = 1280
  18. CONFIG_SCREEN_HEIGHT = 800
  19. CONFIG_SCREEN_AUTOSCALE = "FIXED_HEIGHT"
  20. local scale, scaleX, scaleY
  21. scaleX, scaleY = w / CONFIG_SCREEN_WIDTH, h / CONFIG_SCREEN_HEIGHT
  22. scale = scaleY
  23. CONFIG_SCREEN_WIDTH = w / scale
  24. glview:setDesignResolutionSize(CONFIG_SCREEN_WIDTH, CONFIG_SCREEN_HEIGHT, kResolutionNoBorder)
  25. local winSize = sharedDirector:getWinSize()
  26. display.contentScaleFactor = scale
  27. display.size               = {width = winSize.width, height = winSize.height}
  28. display.width              = display.size.width
  29. display.height             = display.size.height
  30. display.cx                 = display.width / 2
  31. display.cy                 = display.height / 2
  32. display.c_left             = -display.width / 2
  33. display.c_right            = display.width / 2
  34. display.c_top              = display.height / 2
  35. display.c_bottom           = -display.height / 2
  36. display.left               = 0
  37. display.right              = display.width
  38. display.top                = display.height
  39. display.bottom             = 0
  40. display.widthInPixels      = display.sizeInPixels.width
  41. display.heightInPixels     = display.sizeInPixels.height
  42. print("# display in updateScene start")
  43. print(string.format("# us.CONFIG_SCREEN_AUTOSCALE      = %s", CONFIG_SCREEN_AUTOSCALE))
  44. print(string.format("# us.CONFIG_SCREEN_WIDTH          = %0.2f", CONFIG_SCREEN_WIDTH))
  45. print(string.format("# us.CONFIG_SCREEN_HEIGHT         = %0.2f", CONFIG_SCREEN_HEIGHT))
  46. print(string.format("# us.display.widthInPixels        = %0.2f", display.widthInPixels))
  47. print(string.format("# us.display.heightInPixels       = %0.2f", display.heightInPixels))
  48. print(string.format("# us.display.contentScaleFactor   = %0.2f", display.contentScaleFactor))
  49. print(string.format("# us.display.width                = %0.2f", display.width))
  50. print(string.format("# us.display.height               = %0.2f", display.height))
  51. print(string.format("# us.display.cx                   = %0.2f", display.cx))
  52. print(string.format("# us.display.cy                   = %0.2f", display.cy))
  53. print(string.format("# us.display.left                 = %0.2f", display.left))
  54. print(string.format("# us.display.right                = %0.2f", display.right))
  55. print(string.format("# us.display.top                  = %0.2f", display.top))
  56. print(string.format("# us.display.bottom               = %0.2f", display.bottom))
  57. print(string.format("# us.display.c_left               = %0.2f", display.c_left))
  58. print(string.format("# us.display.c_right              = %0.2f", display.c_right))
  59. print(string.format("# us.display.c_top                = %0.2f", display.c_top))
  60. print(string.format("# us.display.c_bottom             = %0.2f", display.c_bottom))
  61. print("# display in updateScene done")
  62. display.ANCHOR_POINTS = {
  63.     CCPoint(0.5, 0.5),  -- CENTER
  64.     CCPoint(0, 1),      -- TOP_LEFT
  65.     CCPoint(0.5, 1),    -- TOP_CENTER
  66.     CCPoint(1, 1),      -- TOP_RIGHT
  67.     CCPoint(0, 0.5),    -- CENTER_LEFT
  68.     CCPoint(1, 0.5),    -- CENTER_RIGHT
  69.     CCPoint(0, 0),      -- BOTTOM_LEFT
  70.     CCPoint(1, 0),      -- BOTTOM_RIGHT
  71.     CCPoint(0.5, 0),    -- BOTTOM_CENTER
  72. }
  73. display.CENTER        = 1
  74. display.LEFT_TOP      = 2; display.TOP_LEFT      = 2
  75. display.CENTER_TOP    = 3; display.TOP_CENTER    = 3
  76. display.RIGHT_TOP     = 4; display.TOP_RIGHT     = 4
  77. display.CENTER_LEFT   = 5; display.LEFT_CENTER   = 5
  78. display.CENTER_RIGHT  = 6; display.RIGHT_CENTER  = 6
  79. display.BOTTOM_LEFT   = 7; display.LEFT_BOTTOM   = 7
  80. display.BOTTOM_RIGHT  = 8; display.RIGHT_BOTTOM  = 8
  81. display.BOTTOM_CENTER = 9; display.CENTER_BOTTOM = 9
  82. function display.align(target, anchorPoint, x, y)
  83.     target:setAnchorPoint(display.ANCHOR_POINTS[anchorPoint])
  84.     if x and y then target:setPosition(x, y) end
  85. end
  86. local us = CCScene:create()
  87. us.name = "updateScene"
  88. local localResInfo = nil
  89. function us._addUI()
  90.     -- Get the newest resinfo in ures.
  91.     local localResInfo = updater.getResCopy()
  92.     local __bg = CCSprite:create(us._getres("res/pic/init_bg.png"))
  93.     display.align(__bg, display.CENTER, display.cx, display.cy)
  94.     us:addChild(__bg, 0)
  95.     local __label = CCLabelTTF:create("Loading...", "Arial", 24)
  96.     __label:setColor(ccc3(255, 0, 0))
  97.     us._label = __label
  98.     display.align(__label, display.CENTER, display.cx, display.bottom+30)
  99.     us:addChild(__label, 10)
  100. end
  101. function us._getres(path)
  102.     if not localResInfo then
  103.         localResInfo = updater.getResCopy()
  104.     end
  105.     for key, value in pairs(localResInfo.oth) do
  106.         print("us._getres:", key, value)
  107.         local pathInIndex = string.find(key, path)
  108.         if pathInIndex and pathInIndex >= 1 then
  109.             print("us._getres getvalue:", path)
  110.             res[path] = value
  111.             return value
  112.         end
  113.     end
  114.     return path
  115. end
  116. function us._sceneHandler(event)
  117.     if event == "enter" then
  118.         print(string.format("updateScene \"%s:onEnter()\"", us.name))
  119.         us.onEnter()
  120.     elseif event == "cleanup" then
  121.         print(string.format("updateScene \"%s:onCleanup()\"", us.name))
  122.         us.onCleanup()
  123.     elseif event == "exit" then
  124.         print(string.format("updateScene \"%s:onExit()\"", us.name))
  125.         us.onExit()
  126.         if DEBUG_MEM then
  127.             print("----------------------------------------")
  128.             print(string.format("LUA VM MEMORY USED: %0.2f KB", collectgarbage("count")))
  129.             CCTextureCache:sharedTextureCache():dumpCachedTextureInfo()
  130.             print("----------------------------------------")
  131.         end
  132.     end
  133. end
  134. function us._updateHandler(event, value)
  135.     updater.state = event
  136.     if event == "success" then
  137.         updater.stateValue = value:getCString()
  138.         updater.updateFinalResInfo()
  139.         if us._succHandler then
  140.             us._succHandler()
  141.         end
  142.     elseif event == "error" then
  143.         updater.stateValue = value:getCString()
  144.     elseif event == "progress" then
  145.         updater.stateValue = tostring(value:getValue())
  146.     elseif event == "state" then
  147.         updater.stateValue = value:getCString()
  148.     end
  149.     us._label:setString(updater.stateValue)
  150.     assert(event ~= "error",
  151.         string.format("Update error: %s !", updater.stateValue))
  152. end
  153. function us.addListener(handler)
  154.     us._succHandler = handler
  155.     return us
  156. end
  157. function us.onEnter()
  158.     updater.update(us._updateHandler)
  159. end
  160. function us.onExit()
  161.     updater.clean()
  162.     us:unregisterScriptHandler()
  163. end
  164. function us.onCleanup()
  165. end
  166. us:registerScriptHandler(us._sceneHandler)
  167. us._addUI()
  168. return us





代码都在上面,说重点:


4.4.1 还是没有framework


这是必须一直牢记的。由于没有载入quick的 framework,所有的quick特性都不能使用。
你也许会说没有framework我怎么写界面?那么想想用C++的同学吧!那个代码怎么也比Lua多吧?


复制代码
  1. display.newSprite("res/pic/init_bg.png")
  2.     :align(display.CENTER, display.cx, display.cy)
  3.     :addTo(self, 0)



在没有quick framework的时候需要改成这样:


复制代码
  1. local __bg = CCSprite:create(us._getres("res/pic/init_bg.png"))
  2. display.align(__bg, display.CENTER, display.cx, display.cy)
  3. us:addChild(__bg, 0)



等等!为啥我用了 display !!!魂淡,你不会偷quick的啊啊啊!
4.4.2 必须要偷的代码
为了方便使用,我们可以偷一部分framework的代码过来(干嘛说得那么难听嘛,程序员怎么能用偷?程序员的事,用CV啊),注意CV来的代码用local变量来保存。由于 updateScene 已经是一个可视的场景,因此quick中关于界面缩放设置的那部分代码也是必须CV过来。不多,几十行而已。
游戏产品绝大多数都不会做成横屏竖屏自动适应的(自己找SHI啊有木有),因此界面缩放的代码我也只保存了一个横屏的,这又省了不少。那CV的同学,注意自己改啊!
4.4.3 update.updateScene._getres(path)
在 update.updateScene 模块中,所有涉及到资源路径的地方,必须使用这个方法来包裹。
这个方法先从 update.updater 模块中获取最新的资源索引列表,然后根据我们传递的相对路径从索引列表中查找到资源的实际路径(可能是原包自带的资源,也可能是更新后的资源的绝对路径),然后载入它们。这能保证我们使用的是最新的资源。
4.4.4 update.updateScene._updateHandler(event, value)
这个方法已经在  上面 C++ 模块中  讲过了。注意其中的 _succHandler 是在 update.UpdateApp 中定义的匿名函数。
4.4.5 怎么使用这个模块

如果你要使用这个模块,那么可能大部分都要重写。你可以看到,我在这个模块中只有一个背景图和一个 CCLabeTTF 来显示下载进度和状态。你当然不希望你的更新界面就是这个样子。怎么也得来个妹子做封面不是?


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值