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 來顯示下載進度和狀態。你當然不希望你的更新界面就是這個樣子。怎麼也得來個妹子做封面不是?


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章