Actionscript 3 向SWF按钮添加超链接

Actionscript 3 向SWF按钮添加超链接,actionscript-3,flash,object,embed,Actionscript 3,Flash,Object,Embed,我有一个SWF文件,我从互联网上下载用于学习: SWF文件上有不同的“位置”,我相信这是一张地图——例如,有一个喷泉、一条赛道、一棵树和一座城堡。我需要做的是让所有不同的位置在单击时重定向到不同的超链接 我看了一下,它建议我下载Flash反编译器的试用版,我已经下载了,但我不知道接下来该怎么做。SWF文件是编译和压缩的ActionScript代码。在没有重新编译的情况下,您无法更改内部的任何内容(通常)。因此,您需要对您拥有的swf进行反编译,希望您能得到一组文件。然后,您需要找到超链接地址所在

我有一个SWF文件,我从互联网上下载用于学习:

SWF文件上有不同的“位置”,我相信这是一张地图——例如,有一个喷泉、一条赛道、一棵树和一座城堡。我需要做的是让所有不同的位置在单击时重定向到不同的超链接


我看了一下,它建议我下载Flash反编译器的试用版,我已经下载了,但我不知道接下来该怎么做。

SWF文件是编译和压缩的ActionScript代码。在没有重新编译的情况下,您无法更改内部的任何内容(通常)。因此,您需要对您拥有的swf进行反编译,希望您能得到一组文件。然后,您需要找到超链接地址所在的代码部分并对其进行更改。然后你需要重新编译代码,如果你足够幸运的话,你会得到带有改变的超链接的swf。嗯,这是个很糟糕的主意

您需要反编译swf,然后修改一些代码,然后将其编译为新代码

我试过你的swf,当你点击位置时,它会重定向到百度网站

这是你的电话号码

你需要两个软件,和

1。反编译swf并找到相关代码

JPEXS用于将swf反编译为代码和png,jpg。当你点击城市时,你可以找到操作的代码,我发现它是Map类,gotoLocation函数。当我试图打开你的swf时,它抛出了一些错误,我直接找到了类名和函数名

2。使用RABCDAsm拆解swf,获取abc代码

RABCDAsm是一个ActionScript 3汇编程序/反汇编程序,它将把swf转换成许多asasm和abc类型的文件,然后您可以在编辑器中修改该文件,RABCDAsm工具可以将这些文件转换成新的swf

因此,这里有一个问题,您如何在生成的文件中使用目标映射文件? 尝试在文件中搜索与反编译类同名的Map.class.asam

3。编写一个包含gotoLocation函数的新映射类,获取目标abc代码

您需要使用新的abc代码替换Map.class.asasm中的abc代码。 尝试创建一个项目,然后添加一个名为Map的类,像这样在其中放置一个gotoLocation函数

package
{
   import flash.net.URLRequest;
   import flash.net.navigateToURL;
   import flash.events.MouseEvent;

   public class Map
   {
       public function Map()
       {
       }

       public function gotoLocation(param1:int) : void
       {
           if(param1 != 999)
           {
               navigateToURL(new URLRequest("http://www.baidu.com"),"_blank");
            }
        }

        private function closeMap(param1:MouseEvent = null) : void
        {

        }
    }
}

获取新项目的发布swf,然后重复第二步,您将获得类的abc代码,如下所示

  trait method QName(PackageNamespace(""), "gotoLocation")
  method
    refid "Map/instance/gotoLocation"
    param QName(PackageNamespace(""), "int")
    returns QName(PackageNamespace(""), "void")
    body
      maxstack 3
      localcount 2
      initscopedepth 4
      maxscopedepth 5
      code
      getlocal0
      pushscope

      getlocal1
      pushshort           999
      ifeq                L11

      findpropstrict      QName(PackageNamespace("flash.net"), "navigateToURL")
      findpropstrict      QName(PackageNamespace("flash.net"), "URLRequest")
      pushstring          "http://www.baidu.com"
      constructprop       QName(PackageNamespace("flash.net"), "URLRequest"), 1
      pushstring          "_blank"
      callpropvoid        QName(PackageNamespace("flash.net"), "navigateToURL"), 2

    L11:
        returnvoid
   end ; code
  end ; body
end ; method
end ; trait
trait method QName(PackageNamespace(""), "gotoLocation")
method
refid "com.binweevils.externalUIs.map:Map/instance/gotoLocation"
param QName(PackageNamespace(""), "int")
returns QName(PackageNamespace(""), "void")
body
  maxstack 2
  localcount 2
  initscopedepth 10
  maxscopedepth 11
  code
  getlocal0
  pushscope

  getlocal1
  pushshort           999
  ifeq                L21

  getlocal0
  getproperty         QName(PrivateNamespace(null, "com.binweevils.externalUIs.map:Map/instance#0"), "bin")
  getproperty         Multiname("crntLocID", [PrivateNamespace(null, "com.binweevils.externalUIs.map:Map/instance#0"), PackageNamespace(""), PackageNamespace("com.binweevils.externalUIs.map"), Namespace("http://adobe.com/AS3/2006/builtin"), PrivateNamespace(null, "com.binweevils.externalUIs.map:Map/instance#1"), PackageInternalNs("com.binweevils.externalUIs.map"), ProtectedNamespace("com.binweevils.externalUIs.map:Map"), StaticProtectedNs("com.binweevils.externalUIs.map:Map"), StaticProtectedNs("flash.display:MovieClip"), StaticProtectedNs("flash.display:Sprite"), StaticProtectedNs("flash.display:DisplayObjectContainer"), StaticProtectedNs("flash.display:InteractiveObject"), StaticProtectedNs("flash.display:DisplayObject"), StaticProtectedNs("flash.events:EventDispatcher")])
  getlocal1
  ifeq                L19
通过搜索函数名很容易找到abc代码

4。替换abc代码,用RABCDAsm创建新的swf

在第二步中,使用新的abc代码替换目标主体零件,然后使用RABCDAsm生成新的swf

像这样的旧abc代码

  trait method QName(PackageNamespace(""), "gotoLocation")
  method
    refid "Map/instance/gotoLocation"
    param QName(PackageNamespace(""), "int")
    returns QName(PackageNamespace(""), "void")
    body
      maxstack 3
      localcount 2
      initscopedepth 4
      maxscopedepth 5
      code
      getlocal0
      pushscope

      getlocal1
      pushshort           999
      ifeq                L11

      findpropstrict      QName(PackageNamespace("flash.net"), "navigateToURL")
      findpropstrict      QName(PackageNamespace("flash.net"), "URLRequest")
      pushstring          "http://www.baidu.com"
      constructprop       QName(PackageNamespace("flash.net"), "URLRequest"), 1
      pushstring          "_blank"
      callpropvoid        QName(PackageNamespace("flash.net"), "navigateToURL"), 2

    L11:
        returnvoid
   end ; code
  end ; body
end ; method
end ; trait
trait method QName(PackageNamespace(""), "gotoLocation")
method
refid "com.binweevils.externalUIs.map:Map/instance/gotoLocation"
param QName(PackageNamespace(""), "int")
returns QName(PackageNamespace(""), "void")
body
  maxstack 2
  localcount 2
  initscopedepth 10
  maxscopedepth 11
  code
  getlocal0
  pushscope

  getlocal1
  pushshort           999
  ifeq                L21

  getlocal0
  getproperty         QName(PrivateNamespace(null, "com.binweevils.externalUIs.map:Map/instance#0"), "bin")
  getproperty         Multiname("crntLocID", [PrivateNamespace(null, "com.binweevils.externalUIs.map:Map/instance#0"), PackageNamespace(""), PackageNamespace("com.binweevils.externalUIs.map"), Namespace("http://adobe.com/AS3/2006/builtin"), PrivateNamespace(null, "com.binweevils.externalUIs.map:Map/instance#1"), PackageInternalNs("com.binweevils.externalUIs.map"), ProtectedNamespace("com.binweevils.externalUIs.map:Map"), StaticProtectedNs("com.binweevils.externalUIs.map:Map"), StaticProtectedNs("flash.display:MovieClip"), StaticProtectedNs("flash.display:Sprite"), StaticProtectedNs("flash.display:DisplayObjectContainer"), StaticProtectedNs("flash.display:InteractiveObject"), StaticProtectedNs("flash.display:DisplayObject"), StaticProtectedNs("flash.events:EventDispatcher")])
  getlocal1
  ifeq                L19
注意 您可以找到适用于windows的RABCDAsm,也可以在其github页面中找到RABCDAsm命令


最后,如果项目很简单,有时您不需要RABCDAsm。尝试将反编译的代码放入项目中,然后修复编译错误。在这种情况下,您需要运气。

JPEXS在编辑代码和保存swf文件方面是否存在问题?@payamsbr我认为对于不同的工具获得正确的结果是一样的。但是我没有使用JPEXS来保存swf文件,只是用于反编译和从内存中转储swf。