修补动作脚本而不经常重建swf

时间:2016-08-23 15:40:22

标签: actionscript-3 flash actionscript swfobject

如何在不经常重建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成员。这可能吗?

1 个答案:

答案 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/获得。