原文地址: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
在程序中,我们一般会使用这样的写法来获取资源:
复制代码
- display.newSprite("pic/init_bg.png")
|
或者干脆简化成了:
复制代码
- display.newSprite("init_bg.png")
|
要上面的代码能够工作,需要为 CCFileUtils 设置搜索路径:
复制代码
-
- CCFileUtils:sharedFileUtils:addSearchPath("res/")
- CCFileUtils:sharedFileUtils:addSearchPath("res/pic/")
|
但是,在这套更新机制中,
我不建议设置搜索路径,因为素材都是以完整路径格式保存的,这样使用起来更方便和更确定。
如果是新项目,那么挺好,我只需要保证素材路径基于 res 提供即可,类似这样:
复制代码
- display.newSprite("res/pic/init_bg.png")
|
但是对于已经开发了一段时间的项目来说,一个个改就太不专业了。这是我们需要扩展一个 io.getres 方法:
复制代码
-
- res = {}
-
- function io.getres(path)
- print("io.getres originl:", path)
- if CCFileUtils:sharedFileUtils():isAbsolutePath(path) then
- return path
- end
- if res[path] then return res[path] end
- for key, value in pairs(finalRes.oth) do
- print(key, value)
- local pathInIndex = string.find(key, path)
- if pathInIndex and pathInIndex >= 1 then
- print("io.getres getvalue:", path)
- res[path] = value
- return value
- end
- end
- print("io.getres no get:", path)
- return path
- end
|
然后,我们需要修改 quick framework 中的display模块让我们的旧代码不必进行任何改动就能生效。
5.2 修改 display.newSprite
找到该方法中的这个部分:
复制代码
-
- if string.byte(filename) == 35 then -- first char is #
- local frame = display.newSpriteFrame(string.sub(filename, 2))
- if frame then
- sprite = spriteClass:createWithSpriteFrame(frame)
- end
- else
- if display.TEXTURES_PIXEL_FORMAT[filename] then
- CCTexture2D:setDefaultAlphaPixelFormat(display.TEXTURES_PIXEL_FORMAT[filename])
- sprite = spriteClass:create(filename)
- CCTexture2D:setDefaultAlphaPixelFormat(kCCTexture2DPixelFormat_RGBA8888)
- else
- sprite = spriteClass:create(filename)
- end
- end
|
将其改为:
复制代码
- if string.byte(filename) == 35 then -- first char is #
- local frame = display.newSpriteFrame(string.sub(filename, 2))
- if frame then
- sprite = spriteClass:createWithSpriteFrame(frame)
- end
- else
- local absfilename = io.getres(filename)
- if display.TEXTURES_PIXEL_FORMAT[filename] then
- CCTexture2D:setDefaultAlphaPixelFormat(display.TEXTURES_PIXEL_FORMAT[filename])
- sprite = spriteClass:create(absfilename)
- CCTexture2D:setDefaultAlphaPixelFormat(kCCTexture2DPixelFormat_RGBA8888)
- else
- sprite = spriteClass:create(absfilename)
- end
- end
|
5.3 修改display.newTilesSprite
将其中的 local sprite = CCSprite:create(filename, rect)
改为local sprite = CCSprite:create(io.getres(filename), rect)
5.4 修改 display.newBatchNode
改法与上面相同。