在不不断重建 swf 的情况下修补 actionscript

patching actionscript without constantly rebuilding swf

如何在不不断重建 sfw 的情况下修补 actionscript? 我需要修改一个相当大的 actionscript 项目,并且在实时站点上使用生成的 swf。我遇到的问题是我需要对 swf 进行快速的小更新,并且每天十次在现场更新 swf 是不可接受的(我不控制那部分,我需要让另一个人把结果在现场)。 我有哪些选择可以解决该问题?当谈到动作脚本和所有与 Flash 相关的东西时,我是一个完全的菜鸟,我什至不确定什么是可能的,什么不是。我正在考虑以下方法,哪些是 possible/acceptable?

假设实时站点在 www.livesite.com/game.html 上并且此页面加载 www.livesite.com/flashgame.swf。在那个 flashgame.swf 中,有一个 class com/livesite/Magic.as 被实例化,class 的实例有一个 class 的成员变量 xxx123 com/livesite/MagicWork.as。我只需要修改这个MagicWorkclass。现在,我只需对其进行修改、构建并要求将更新的 flashgame.swf 上线。所以,我想避免手动步骤。

我所有的想法都可以分为两种基本方法:1) 保持 flashgame.swf 完全不变,然后加载包含 MagicWork class 替代实现的 flashgame.mod.swf ,然后使用 javascript 访问该 Magic class 实例的内部结构,并将其 xxx123 成员更新为 MagicWork class 来自 flashgame.mode.swf 的实例.我需要修改 game.html 来加载我的 javascript,这样我的 js 文件就会加载 flashgame.mod.swf 并在 flashgame.swf 中加载补丁代码。通过修补,我的意思是 javascript-style 将 Magic.xxx123 覆盖为新值。 flashgame.mode.swf 理想情况下驻留在我自己控制的主机上。那种东西是可能的,如果不是,那是不可能的? 2) 我可以在 flashgame.swf 中进行一次性更改,以便它可以在运行时有效地自行加载我自己的代码并修补它的 xxx123 成员。这可能吗?

我之前已经写了一篇关于加载运行时共享库​​的笔记。我将把过程中最重要的部分放在这里,并在最后为全文添加一个link。

您需要按以下方式标记您的主应用程序入口点。

[Frame(factoryClass="Preloader")]
public class Main extends Sprite
{

}

然后创建一个名为 Preloader 的 class。

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 class 的完整实现是这样的。

[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/.

获取完整文章和相同示例