如何在不经常重建sfw的情况下修补动作? 我需要修改一个相当大的actionscript项目,并在实时站点上使用生成的swf。我遇到的问题是我需要对swf进行快速的小更新,并且每天十次更新现场的swf是不可接受的(我不控制那部分,我需要让另一个人把结果放在一边在现场网站上)。 我有什么选择来解决这个问题?当谈到动作脚本和所有闪光相关的东西时,我是一个完整的菜鸟,我甚至不确定什么是可能的,什么不是。我正在考虑以下方法,哪些方法可行/可接受?
想象一下,实时网站位于www.livesite.com/game.html
,此网页会加载www.livesite.com/flashgame.swf
。在其中许多其他flashgame.swf
中,有一个类com/livesite/Magic.as
被实例化,该类的实例具有类xxx123
的成员变量com/livesite/MagicWork.as
。我只需要修改这个MagicWork
类。现在,我只是修改它,构建并要求更新flashgame.swf
直播。所以,我想避免那个手动步骤。
我的所有想法都可以分为两种基本方法:1)保持flashgame.swf完全不修改,然后加载包含该MagicWork
类的替代实现的flashgame.mod.swf,然后使用javascript访问实例内部该Magic类的更新并将其xxx123
成员更新为MagicWork
的{{1}}类的实例。我需要修改flashgame.mode.swf
以加载我的javascript,以便我的js文件加载game.html
并在flashgame.mod.swf
内修补代码。通过修补我的意思是将JavaScript.xxx123的javascript风格覆盖为新值。理想情况下,flashgame.swf
会驻留在我控制的主机上。这种东西是否可能,如果不是不可能的话?
2)我可以在flashgame.mode.swf
中进行一次性更改,以便在运行时有效地加载我自己的代码并修补它的flashgame.swf
成员。这可能吗?
答案 0 :(得分:2)
我之前已经写过关于加载运行时共享库的说明。我将把这个过程中最重要的部分放在这里,并在最后添加一篇完整文章的链接。
您需要按以下方式标记主应用程序入口点。
[Frame(factoryClass="Preloader")]
public class Main extends Sprite
{
}
然后创建一个名为Preloader的类。
public class Preloader
{
public function Preloader()
{
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, this.loader_completeHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, this.loader_ioErrorHandler);
var request:URLRequest = new URLRequest("math.swf");
var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
loader.load(request, context);
}
private function loader_completeHandler(event:Event):void
{
var mainClass:Class = getDefinitionByName("Main") as Class;
var mainInstance:Main = new mainClass();
this.addChild(mainInstance);
}
}
Main类的完整实现是这样的。
[Frame(factoryClass="Preloader")]
public function Main()
{
var integer:IntegerArithmetic = new IntegerArithmetic(); // Type declared in math.swf
var operand1:int = 10;
var operand2:int = 10;
var result:int = integer.add(operand1, operand2);
}
部署运行时共享库
关于使用运行时共享库的令人困惑的一点是意识到在部署应用程序时必须从SWC中提取SWF。这并不是很明显,我最终花了几天时间将编译好的SWC文件放在不同的位置,并想知道为什么应用程序无法在运行时加载它。 Adobe网站上一篇晦涩难懂的文章明确指出了这一特定步骤,并将事情做好了准备。
完整的文章以及相同的示例可在http://www.notadesigner.com/runtime-shared-libraries-with-plain-actionscript/获得。