quick-cocos2d-x的热更新机制实现对 framework 的修改

2019-04-15 14:58发布

原文地址:http://www.cocoachina.com/bbs/read.php?tid=213061 5 对 framework 的修改
5.1 写一个 getres 方法

ures 中包含的就是所有素材的索引(键值对)。形式如下:
  • 键名:res/pic/init_bg.png
  • 键值(lres中): res/pic/init_bg.png
  • 键值(ures中):/Users/zrong/Library/Application Support/iPhone Simulator/7.1/Applications/2B46FAC0-C419-42B5-92B0-B06DD16E113B/Documents/res/pic/init_bg.png
在程序中,我们一般会使用这样的写法来获取资源:



复制代码
  1. display.newSprite("pic/init_bg.png")


或者干脆简化成了:

复制代码
  1. display.newSprite("init_bg.png")


要上面的代码能够工作,需要为 CCFileUtils 设置搜索路径:
复制代码
  1. CCFileUtils:sharedFileUtils:addSearchPath("res/")
  2. CCFileUtils:sharedFileUtils:addSearchPath("res/pic/")



但是,在这套更新机制中,我不建议设置搜索路径,因为素材都是以完整路径格式保存的,这样使用起来更方便和更确定。
如果是新项目,那么挺好,我只需要保证素材路径基于 res 提供即可,类似这样:


复制代码
  1. display.newSprite("res/pic/init_bg.png")



但是对于已经开发了一段时间的项目来说,一个个改就太不专业了。这是我们需要扩展一个 io.getres 方法:

复制代码
  1. res = {}
  2. function io.getres(path)
  3.     print("io.getres originl:", path)
  4.     if CCFileUtils:sharedFileUtils():isAbsolutePath(path) then
  5.         return path
  6.     end
  7.     if res[path] then return res[path] end
  8.     for key, value in pairs(finalRes.oth) do
  9.         print(key, value)
  10.         local pathInIndex = string.find(key, path)
  11.         if pathInIndex and pathInIndex >= 1 then
  12.             print("io.getres getvalue:", path)
  13.             res[path] = value
  14.             return value
  15.         end
  16.     end
  17.     print("io.getres no get:", path)
  18.     return path
  19. end



然后,我们需要修改 quick framework 中的display模块让我们的旧代码不必进行任何改动就能生效。
5.2 修改 display.newSprite
找到该方法中的这个部分:

复制代码
  1. if string.byte(filename) == 35 then -- first char is #
  2.     local frame = display.newSpriteFrame(string.sub(filename, 2))
  3.     if frame then
  4.         sprite = spriteClass:createWithSpriteFrame(frame)
  5.     end
  6. else
  7.     if display.TEXTURES_PIXEL_FORMAT[filename] then
  8.         CCTexture2D:setDefaultAlphaPixelFormat(display.TEXTURES_PIXEL_FORMAT[filename])
  9.         sprite = spriteClass:create(filename)
  10.         CCTexture2D:setDefaultAlphaPixelFormat(kCCTexture2DPixelFormat_RGBA8888)
  11.     else
  12.         sprite = spriteClass:create(filename)
  13.     end
  14. end


将其改为:



复制代码
  1. if string.byte(filename) == 35 then -- first char is #
  2.     local frame = display.newSpriteFrame(string.sub(filename, 2))
  3.     if frame then
  4.         sprite = spriteClass:createWithSpriteFrame(frame)
  5.     end
  6. else
  7.     local absfilename = io.getres(filename)
  8.     if display.TEXTURES_PIXEL_FORMAT[filename] then
  9.         CCTexture2D:setDefaultAlphaPixelFormat(display.TEXTURES_PIXEL_FORMAT[filename])
  10.         sprite = spriteClass:create(absfilename)
  11.         CCTexture2D:setDefaultAlphaPixelFormat(kCCTexture2DPixelFormat_RGBA8888)
  12.     else
  13.         sprite = spriteClass:create(absfilename)
  14.     end
  15. end


5.3 修改display.newTilesSprite
将其中的 local sprite = CCSprite:create(filename, rect)
改为local sprite = CCSprite:create(io.getres(filename), rect)
5.4 修改 display.newBatchNode
改法与上面相同。