gpt4 book ai didi

ios - 如何复制从iOS air应用程序加载的外部SWF中包含的AS3中的MovieClip?

转载 作者:行者123 更新时间:2023-11-29 12:54:03 24 4
gpt4 key购买 nike

我有一个用于目录的iOS应用程序,可从远程服务器加载资产(不带ActionScript),因此目录编辑器可以更新这些资产(目录),以便每个月创建一个新的目录。

通过Air for iOS,您可以加载SWF文件,而无需在其中添加ActionScript代码。因此,我要从外部SWF文件加载我的资产,并通过Ad Hoc或App Store模式进行编译成功进行测试。

其中一些资产是动画电影剪辑(带有内部电影剪辑,几帧和运动动画),需要在应用程序中实例化几次(随机次数)以实现交互功能。

某些背景:

  • 创建可重复项的标准方法是在Flash IDE中为它们分配一个链接类名称,该名称对桌面应用程序效果很好,但是iOS似乎将其解释为代码,因此在加载资源时不会将其导入,因此无法从APP实例化该元素。
  • 有几种尝试来复制旧的as2plicateMovieClip函数,但是它们并不复制内部影片剪辑,动作和内部影片剪辑。 This is an example.
  • this question中,他们说这是不可能的,并提出了一个解决方案,其中必须将movieclip包含在主应用程序中,但是这样一来,一旦应用程序获得批准,编辑者将无法更新图形和动画。在商店。关键是允许编辑者更新产品目录。
  • Here is an additional discussion about the topic

  • 可能的解决方案:
  • 我正在考虑实现某种递归迭代,以从头开始创建每个DisplayObject,但是我仍然找不到一致的方法来复制Flash UI中的编辑器创建的形状。实际上,they say it´s not possible either可以做的就是创建“位图”副本,如果创建的副本太多,则处理起来可能特别繁琐。
  • 我想,大概唯一的方法是找到一些编译技巧,使外部SWF定义新的Class,以便可以在主应用程序中创建实例。目前,编辑器将无法更改可复制对象。
  • 也有可能将可复制元素放在单独的SWF中,并将其加载几次,但是我不知道这种方法是否可行,尽管这对设计者来说有点麻烦。
  • 我也尝试序列化整个动画片段的反序列化,但是我也没有找到一致的方法。

  • 给Adobe Flash开发人员的说明:
    应更改AS3 Loader类的ARM / iOS实现,以在执行上下文中包括链接类,因为开发人员希望能够使用链接类实例化动画片段,即使它们包含在从iOS加载的外部SWF中也是如此。空气应用。当前,实例化在iOS-air中失败,但是在桌面环境中运行良好。我知道Apple不允许执行从外部SWF加载的代码,但这不是代码执行,这只是一个Class链接,可用于从实际应用程序代码创建动画片段的多个实例。

    有人可以帮忙吗?

    最佳答案

    我本人也遇到了同样的问题,最终我在外部SWF的舞台上使用了重复的符号。我在舞台上重复了大约30次符号

    我按顺序命名了实例,例如card0 card1 card2等

    然后在代码中,我有一个for循环,该循环在加载的SWF内获取对这些对象的引用,并将其放入池(数组)中,然后将其作为子元素从外部swf中删除。

    垃圾收集器似乎并未删除对象,因为它们仍被Array引用。

    然后,我有代码来管理池中项目的分配,而不是实例化它们。

    它确实使外部swf有点大,但对于我池中的30个项目来说却不多,因为它们仅引用库中的符号

    您可以编写JSFL脚本在FLA中进行复制和命名,以自动执行该过程。

    顺便说一句。

    我尝试了其他(更清洁)的方法,但是它们都无法在iOS上运行

    在PC上,如果将其标记为Export For ActionScript,则可以从外部SWF中的符号获取类定义,然后实例化该类。
    例如

    applicationDomain.getDefinition("Card") as Class;

    注意。我设置了加载器上下文
    var ldrContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain );

    将加载的swf与当前应用程序域相同,否则iOS根本无法加载和使用SWF。

    但是,这仅适用于PC,而奇怪的是不适用于Mac(OSX)。

    我的下一个尝试是将符号的一个副本放在舞台上并使用
    例如
    _cardSWFClass =  Object(_contentSWF.card).constructor;

    其中contentSWF是外部加载的swf的MC对象,“card”是要克隆的对象在其上的实例名称。

    此方法适用于PC和Mac,但不适用于iOS

    但是,我觉得这仅在PC和Max上有效,因为在FLA中加载外部SWF的类名可能与外部SWF相同,因为我从应用到外部内容。

    这也让我想知道,是否值得尝试让外部MC使用与应用程序代码相同的程序包名称,而不是在我的案例中加载的外部swf没有为SWF定义类或程序包名称。

    即在App FLA /代码中定义空类,并在外部SWF中引用与App FLA相同的程序包中的相同类名。

    这些类可能需要为空(可能根本没有AS文件),因为iOS不应加载包含代码的外部SWF。
    但是在实践中,iOS似乎会加载包含时间轴代码的外部SWF,但该代码会被加载程序删除。

    进一步探索的途径可能是可用于为核心App代码内部的外部加载SWF构建代码的方法,并且该方法在运行时受到某种方式的约束。

    这样做的副产品可能允许实例化外部符号(实际上,我想肯定需要这样做,否则似乎毫无意义)

    即如本概述 http://blogs.adobe.com/airodynamics/2012/11/09/packaging-and-loading-multiple-swfs-in-air-apps-on-ios/

    但是,时间压力使我无法对此进行进一步的研究。

    编辑。忽略链接。我认为这是一条红鲱鱼。

    编辑2。

    我有部分解决方案,可能对某些人有用。

    我对在加载SWF的类和外部SWF本身中使用相同的程序包名称和类名称的直觉似乎是正确的。

    但是,只有在外部内容的舞台上存在符号实例的情况下,才可以使用此方法工作,该实例可用于访问外部符号的构造函数。
    使用getDefinition方法似乎不起作用。

    例如此代码获取_contentSWF中名为“card”的实例的类
    _cardSWFClass =  Object(_contentSWF.card).constructor;

    另请注意,在PC上(尽管不是在Mac上,可能在iOS上也可能不在iOS上),相关类必须定义其所有已命名的子对象,即好像您没有在舞台上自动声明实例一样。

    在我的情况下,我的“卡”符号具有一个名为txt的TextField以及其他一些我需要存储数据的属性,因此我不得不将它们添加到类中,例如
    package DragAndDrop 
    {
    import flash.display.MovieClip;
    import flash.text.TextField;

    /**
    * ...
    * @author Roger Clark
    */
    public class Drag extends MovieClip
    {
    public var txt:TextField;
    public var originalX:Number;
    public var originalY:Number;
    public var itemData:XML;
    public function Drag()
    {

    }

    }
    }

    一注。

    实例化的类不是DragAndDrop.Drag(或仅仅是Drag),即,尽管PC和Mac都报告了该跟踪(_cardSWFClass);在Mac上为[class Drag],这在运行时失败,并给出错误#1034(类型强制失败),因为在我的Mac上,运行时类型报告为DragAndDrop.Drag@9a40e51

    因此,有必要将对象类型声明为实例化的:MovieClip。似乎无法将其投射到Drag(仅投射到MovieClip)

    请注意。我没有做大量的测试来查看对此是否还有其他限制,但是使用AIR 4和iOS6确实可以使用。

    编辑3。

    我刚刚发现了另一件事。 “发布” SWF时,外部FLA不必访问Class源文件。
    我意识到自己不小心弄错了路径,并且我的外部FLA无法访问AS类文件,并且正在动态创建自己的空类定义。

    我用正确的路径重新测试了它,似乎没有什么区别,即它仍然可以在PC,Mac和iOS上运行

    此外,对于未在外部FLA中定义的项目,我尝试从外部Class定义文件中删除属性。 originalX和originalY,但是没有这些,我在PC上遇到运行时错误。

    我发现这些运行时错误非常奇怪,因为我声明了实例化为MovieClip的类,而MovieClip是动态类。
    因此,好像Flash认为其实例化的类是某种非动态MovieClip的特殊类型

    编辑4。

    我遇到了另一个需要注意的问题。
    看起来,在某些情况下,复制所需的符号(通过访问其构造函数)必须出现在外部SWF的帧1上,并且可能出现在外部MC的所有其他帧上。

    如果尝试获取这些实例的构造函数,而它们在第1帧中不存在,则Flash返回的类仅为MovieClip,而不是为符号定义的类(在库中定义)。
    注意。这些符号已在第1帧上标记为要导出,所以这不是原因。

    目前,我还不确定确切的情况,因为这可能与加载外部swf的路径有关,也可能是由于AIR应用程序加载外部SWF引起的。

    即,当我直接将SWF加载到另一个SWF(在PC上)时,它工作正常,但是当从作为AIR App的一部分编译的SWC加载外部SWF时,则失败(在PC上)。

    如果我能找到导致这些差异的确切原因,我将发布更多信息。

    编辑5。

    这是一个持续不断的传奇。

    我发现使用这种方法存在一个问题。
    在iOS上,您需要将SWF加载到当前的ApplicationDomain中,否则根本无法使用SWF。
    但是,如果加载的不同SWF文件中的符号具有相同的类名,则Flash会缓存使用此方法实例化的第一个实例(符号)。

    正常的解决方法是为每个加载的swf创建一个新的Application域,然后释放该域。
    参见 ApplicationDomain clarifiation needed

    但是,这在iOS上不起作用,因为您似乎总是需要加载到ApplicationDomain.current域中

    参见 problems with loading embedded swf files in air app

    因此,尽管我的变通办法可以工作,但是如果您要加载多个外部swf,并且每个swf都使用具有相同类名但图形内容不同的符号,则它不会有太大用处。

    关于ios - 如何复制从iOS air应用程序加载的外部SWF中包含的AS3中的MovieClip?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21618868/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com