最近在做一个web-game游戏,项目已经接近尾声,SWF的文件尺寸已经很大,急于分解出多个模块以减少启动时间。
【需求描述】
  有三种不同的SWF文件:共享库、模块、外壳/主程序。
  目的是在各模块中共享库中的元件,并且外壳加载各模块时不需要过多的参与共享关系。UI负责设计各SWF,程序负责写AS代码。实现和使用应当简单、快速、有效。
【目前的实现】
  1,在库中导出元件 MyButton,选择为AS导出,在第一帧导出,指定类名 MyButton
  2,在模块中设计并导出元件 MyModule, 里面使用了库中的元件 MyButton,选择 为运行时导入,并指定URL。为了方便使用,给元件 MyButton 取了实例名 m_btn。
  (问题:如果取了实例名,则导出影片时会提示无法找到标示符,我的解决方法是定义了一个类文件 MyButton 关联到元件上,然后导出正常)
  3,在外壳中首先加载库到当前域(共享域),然后加载模块到子域。  (我的理解:FLASH 加载模块时,发现其中使用了库,于是继续加载库资源。但它发现模块中需要的类 MyButton 在共享域中已经有定义,因此会忽略。结果就是 FLASH 不需要再次加载库,达到了共享的目的)【问题描述】
  上述方案在本机(代码、资源都在本地)上测试通过。可当放到网站上时,外壳加载模块时会失败:加载的进度很快达到100%,但一直停留在那里。
  我的感觉是模块加载完毕后,继续加载其中的库时---发现共享域中已经存在相同定义而忽略,另一方面模块中的导入元件无法与共享库中的元件建立关联,因此一直无法初始化。
  在网站上所有的文件都放在相同路径,应该不会存在安全策略、沙箱问题。
【提问】
  FLASH 对于本地、网站上的资源加载策略是否有不同,为什么会出现这样的问题,如何解决?  
  

解决方案 »

  1.   

    该问题已解决:1,在外网的实际应用中加入了版本控制,因此实际的 url 是类似 "库.swf?20091221.1" 的名称. 而在 模块.swf 中固定写明的导入 url 为 "库.swf". 这两个字符串不同, url地址不同, 因此共享失败. 加载 模块.swf 进度100%后, 继续重新加载 库.swf, 进度条停留较长时间不动.2, 解决方案是以二进制读入 "模块.swf", 然后查找它的导入表, 把所有 "库.swf" 的字符串替换为 "库.swf?当前版本号", 然后用 Loader 加载. (为了替换时翻遍, 可以再设计 模块.swf 时,把导入的 url 写为 "库.swf?yymmdd.1", 即等长字符串)