原文地址: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
改法与上面相同。