sequFrameAnimLoaderImpSkill.lua 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. local sequFrameAnimLoader = require( "animation/sequFrameAnimLoader" )
  2. local sequFrameAnimLoaderImpSkill = class('sequFrameAnimLoaderImpSkill', sequFrameAnimLoader)
  3. local ANIM_RES_PATH ="anim/effect/"
  4. function sequFrameAnimLoaderImpSkill:ctor()
  5. sequFrameAnimLoaderImpSkill.super.ctor(self)
  6. end
  7. function sequFrameAnimLoaderImpSkill:init()
  8. sequFrameAnimLoaderImpSkill.super.init(self)
  9. end
  10. function sequFrameAnimLoaderImpSkill:convertTexFileName( rawAnimID, sex, dir )
  11. return string.format( "%ssfx_%04d_%d.png", ANIM_RES_PATH, rawAnimID, dir )
  12. end
  13. function sequFrameAnimLoaderImpSkill:convertPlistFileName( rawAnimID, sex, dir )
  14. return string.format( "%ssfx_%04d_%d.plist", ANIM_RES_PATH, rawAnimID, dir )
  15. end
  16. function sequFrameAnimLoaderImpSkill:convertTexFileNameByIdx( rawAnimID, sex, dir, idx )
  17. return string.format( "%ssfx_%04d_%d_%d.png", ANIM_RES_PATH, rawAnimID, dir, idx )
  18. end
  19. function sequFrameAnimLoaderImpSkill:convertPlistFileNameByIdx( rawAnimID, sex, dir, idx )
  20. return string.format( "%ssfx_%04d_%d_%d.plist", ANIM_RES_PATH, rawAnimID, dir, idx )
  21. end
  22. function sequFrameAnimLoaderImpSkill:convertFrameName( rawAnimID, sex, act, dir, frameID )
  23. return string.format( "sfx_%04d_%d_%04d.png", rawAnimID, dir, frameID )
  24. end
  25. function sequFrameAnimLoaderImpSkill:animResTextureLoad( animDataDesc, dir )
  26. local animID = animDataDesc.animID
  27. local modelProxy = global.Facade:retrieveProxy( global.ProxyTable.ModelConfigProxy )
  28. local config = modelProxy:GetConfig( animID )
  29. if nil == config then
  30. self:animResConfigFailed(animDataDesc, dir)
  31. return
  32. end
  33. -- calc temporary ID
  34. local temporaryID = global.FrameAnimManager:GetAnimTemporaryID(animDataDesc.animType, animDataDesc.sex)
  35. -- out of memory
  36. if global.FrameAnimManager:isMemWarning(animDataDesc.animType) and animDataDesc.animID ~= temporaryID then
  37. self:animResMemoryWarning(animDataDesc, dir)
  38. return
  39. end
  40. -- loading res
  41. if animDataDesc.animID == temporaryID then
  42. local texFile = self:convertTexFileName( animDataDesc.rawAnimID, animDataDesc.sex, dir )
  43. local plistFile = self:convertPlistFileName( animDataDesc.rawAnimID, animDataDesc.sex, dir )
  44. if not global.SpriteFrameCache:isSpriteFramesWithFileLoaded(plistFile) then
  45. local function addImageCallback( tex, plistOK )
  46. -- for memory record
  47. global.FrameAnimManager:textureMemAdd(tex, texFile)
  48. self:animResTextureLoadCB( animDataDesc, dir, tex, plistOK, config )
  49. end
  50. global.SpriteFrameCache:addSpriteFramesWithFileAsync( plistFile, texFile, addImageCallback )
  51. else
  52. self:animResTextureLoadCB( animDataDesc, dir, true, true, config )
  53. end
  54. else
  55. local atlasCount = modelProxy:GetSplitAtlas( animID, dir )
  56. if atlasCount and atlasCount > 1 then
  57. for idx = 0, atlasCount-1 do
  58. local texFile = self:convertTexFileNameByIdx( animDataDesc.rawAnimID, animDataDesc.sex, dir, idx )
  59. local plistFile = self:convertPlistFileNameByIdx( animDataDesc.rawAnimID, animDataDesc.sex, dir, idx )
  60. if not global.FileUtilCtl:isFileExist(plistFile) then
  61. self:downloadRes(plistFile, function(isOK)
  62. if isOK then
  63. self:animResTextureLoad(animDataDesc, dir)
  64. else
  65. self:animResDownloadFailed(animDataDesc, dir)
  66. end
  67. end)
  68. break
  69. elseif not global.FileUtilCtl:isFileExist(texFile) then
  70. self:downloadRes(texFile, function(isOK)
  71. if isOK then
  72. self:animResTextureLoad(animDataDesc, dir)
  73. else
  74. self:animResDownloadFailed(animDataDesc, dir)
  75. end
  76. end)
  77. break
  78. elseif not global.SpriteFrameCache:isSpriteFramesWithFileLoaded(plistFile) then
  79. local function addImageCallback( tex, plistOK )
  80. -- for memory record
  81. global.FrameAnimManager:textureMemAdd(tex, texFile)
  82. if not plistOK or tex == nil then
  83. self:animResTextureLoadCB( animDataDesc, dir, nil, false, config )
  84. else
  85. self:animResTextureLoad(animDataDesc, dir)
  86. end
  87. end
  88. global.SpriteFrameCache:addSpriteFramesWithFileAsync( plistFile, texFile, addImageCallback )
  89. break
  90. elseif idx == atlasCount -1 then
  91. self:animResTextureLoadCB( animDataDesc, dir, true, true, config )
  92. end
  93. end
  94. else
  95. local texFile = self:convertTexFileName( animDataDesc.rawAnimID, animDataDesc.sex, dir )
  96. local plistFile = self:convertPlistFileName( animDataDesc.rawAnimID, animDataDesc.sex, dir )
  97. if not global.FileUtilCtl:isFileExist(plistFile) then
  98. self:downloadRes(plistFile, function(isOK)
  99. if isOK then
  100. self:animResTextureLoad(animDataDesc, dir)
  101. else
  102. self:animResDownloadFailed(animDataDesc, dir)
  103. end
  104. end)
  105. elseif not global.FileUtilCtl:isFileExist(texFile) then
  106. self:downloadRes(texFile, function(isOK)
  107. if isOK then
  108. self:animResTextureLoad(animDataDesc, dir)
  109. else
  110. self:animResDownloadFailed(animDataDesc, dir)
  111. end
  112. end)
  113. elseif not global.SpriteFrameCache:isSpriteFramesWithFileLoaded(plistFile) then
  114. local function addImageCallback( tex, plistOK )
  115. -- for memory record
  116. global.FrameAnimManager:textureMemAdd(tex, texFile)
  117. self:animResTextureLoadCB( animDataDesc, dir, tex, plistOK, config )
  118. end
  119. global.SpriteFrameCache:addSpriteFramesWithFileAsync( plistFile, texFile, addImageCallback )
  120. else
  121. self:animResTextureLoadCB( animDataDesc, dir, true, true, config )
  122. end
  123. end
  124. end
  125. end
  126. function sequFrameAnimLoaderImpSkill:animResTextureLoadCB( animDataDesc, dir, tex, plistOK, config )
  127. if not plistOK or nil == tex then
  128. -- remove anim texture
  129. self:removeTextureCache(animDataDesc, dir)
  130. -- except temporary
  131. local temporaryID = global.FrameAnimManager:GetAnimTemporaryID(animDataDesc.animType, animDataDesc.sex)
  132. if animDataDesc.animID ~= temporaryID then
  133. -- remove texture
  134. local modelProxy = global.Facade:retrieveProxy( global.ProxyTable.ModelConfigProxy )
  135. local atlasCount = modelProxy:GetSplitAtlas( animDataDesc.animID, dir )
  136. if atlasCount and atlasCount > 1 then
  137. for idx = 0, atlasCount-1 do
  138. -- del plist
  139. local plistFile = self:convertPlistFileNameByIdx( animDataDesc.rawAnimID, animDataDesc.sex, dir, idx )
  140. self:onLoadFileError(plistFile)
  141. -- del png
  142. local texFile = self:convertTexFileNameByIdx( animDataDesc.rawAnimID, animDataDesc.sex, dir, idx )
  143. self:onLoadFileError(texFile)
  144. end
  145. else
  146. -- del plist
  147. local plistFile = self:convertPlistFileName( animDataDesc.rawAnimID, animDataDesc.sex, dir )
  148. self:onLoadFileError(plistFile)
  149. -- del png
  150. local texFile = self:convertTexFileName( animDataDesc.rawAnimID, animDataDesc.sex, dir )
  151. self:onLoadFileError(texFile)
  152. end
  153. end
  154. else
  155. -- creat sprite frame
  156. self:createAnimation( animDataDesc, dir, config )
  157. end
  158. -- notify
  159. if not plistOK then
  160. self:notifyCaller( animDataDesc, dir, global.MMO.ANIM_LOAD_FRAME )
  161. elseif nil == tex then
  162. self:notifyCaller( animDataDesc, dir, global.MMO.ANIM_LOAD_TEX )
  163. else
  164. self:notifyCaller( animDataDesc, dir, global.MMO.ANIM_LOAD_SUCCESS )
  165. end
  166. -- on load finish notice
  167. self:OnLoadingFinish()
  168. end
  169. function sequFrameAnimLoaderImpSkill:releaseCocosAnim( animDataDesc, act, actionDir )
  170. local animIndex = GetFrameAnimIndex( act, actionDir )
  171. local animFrameVec = animDataDesc.animFrameVecs[animIndex]
  172. if animFrameVec then
  173. for _, animFrame in ipairs( animFrameVec ) do
  174. if not tolua.isnull(animFrame) then
  175. animFrame:release()
  176. end
  177. end
  178. end
  179. animDataDesc.animFrameVecs[animIndex] = nil
  180. end
  181. function sequFrameAnimLoaderImpSkill:unloadSequAnim( animDataDesc )
  182. local animCount = global.MMO.ORIENT_LU
  183. local act = global.MMO.ANIM_DEFAULT
  184. for dir = 0, animCount do
  185. if true == animDataDesc.frameLoaded[dir] then
  186. -- step1 cocos anim
  187. self:releaseCocosAnim( animDataDesc, act, dir )
  188. -- remove anim texture
  189. self:removeTextureCache(animDataDesc, dir)
  190. animDataDesc.frameLoaded[dir] = nil
  191. end
  192. end
  193. end
  194. function sequFrameAnimLoaderImpSkill:createAnimation( animDataDesc, dir, config )
  195. local animID = animDataDesc.animID
  196. local sex = animDataDesc.sex
  197. local frameName = ""
  198. local spriteFrame = nil
  199. local animFrame = nil
  200. local act = global.MMO.ANIM_DEFAULT
  201. local animIndex = GetFrameAnimIndex( act, dir )
  202. local animFrameVec = {}
  203. local animFrameCnt = 0
  204. for xy = 0, 100 do
  205. frameName = self:convertFrameName( animDataDesc.rawAnimID, sex, act, dir, xy )
  206. spriteFrame = global.SpriteFrameCache:getSpriteFrame( frameName, true )
  207. if spriteFrame then
  208. animFrame = cc.AnimationFrame:create( spriteFrame, 1, {} )
  209. animFrame:retain()
  210. animFrameCnt = animFrameCnt + 1
  211. animFrameVec[animFrameCnt] = animFrame
  212. else
  213. config.frame[act] = xy + 1
  214. break
  215. end
  216. end
  217. animDataDesc.animFrameVecs[animIndex] = animFrameCnt > 0 and animFrameVec or nil
  218. animDataDesc.animDelays[animIndex] = config.interval[act] or global.MMO.ANIM_DEFAULT_INTERVAL
  219. animDataDesc.frameLoaded[dir] = true
  220. end
  221. function sequFrameAnimLoaderImpSkill:removeTextureCache(animDataDesc, dir)
  222. local modelProxy = global.Facade:retrieveProxy( global.ProxyTable.ModelConfigProxy )
  223. local config = modelProxy:GetConfig( animDataDesc.animID )
  224. if not config then
  225. return
  226. end
  227. local atlasCount = modelProxy:GetSplitAtlas( animDataDesc.animID, dir )
  228. if atlasCount and atlasCount > 1 then
  229. for idx = 0, atlasCount-1 do
  230. local texFile = self:convertTexFileNameByIdx( animDataDesc.rawAnimID, animDataDesc.sex, dir, idx )
  231. local plistFile = self:convertPlistFileNameByIdx( animDataDesc.rawAnimID, animDataDesc.sex, dir, idx )
  232. if global.SpriteFrameCache:isSpriteFramesWithFileLoaded( plistFile ) then
  233. global.SpriteFrameCache:removeSpriteFramesFromFile( plistFile )
  234. global.TextureCache:removeTextureForKey( texFile )
  235. -- for memory record
  236. global.FrameAnimManager:textureMemDel(texFile)
  237. end
  238. end
  239. else
  240. local texFile = self:convertTexFileName( animDataDesc.rawAnimID, animDataDesc.sex, dir )
  241. local plistFile = self:convertPlistFileName( animDataDesc.rawAnimID, animDataDesc.sex, dir )
  242. if global.SpriteFrameCache:isSpriteFramesWithFileLoaded( plistFile ) then
  243. global.SpriteFrameCache:removeSpriteFramesFromFile( plistFile )
  244. global.TextureCache:removeTextureForKey( texFile )
  245. -- for memory record
  246. global.FrameAnimManager:textureMemDel(texFile)
  247. end
  248. end
  249. end
  250. return sequFrameAnimLoaderImpSkill