在不不断重建 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
。我只需要修改这个MagicWork
class。现在,我只需对其进行修改、构建并要求将更新的 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/.
获取完整文章和相同示例
如何在不不断重建 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
。我只需要修改这个MagicWork
class。现在,我只需对其进行修改、构建并要求将更新的 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/.
获取完整文章和相同示例