1

我正在尝试将 RSL 库加载到使用 Flash CS5 IDE 开发的 Flash 动画中,该动画扩展了自定义类并实现了接口。我已将问题简化为最简单的设置,并发现我可以让我的主类扩展另一个类或实现一个接口,但如果我想加载 RSL,则不能同时进行这两种操作。

我有一个非常简单的类来扩展:

import flash.display.Sprite;
public class MySprite extends Sprite 
{

    public function MySprite() 
    {

    }
}

带有 TestSymbol 的主类,它是 RSL 库中的一个符号:

import flash.display.Sprite;
public class MainApp extends MySprite implements ITest
{
    public var bug:TestSymbol = new TestSymbol();

    public function MainApp() 
    {
        addChild(bug);
    }
    //To meet interface requirements
    public function test():void {

    }
}

}

和一个非常简单的界面

    public interface ITest 
{
    function test():void
}

RSL 库也是一个非常简单的库 - 只是一个带有方形绘图的符号。它在动作脚本设置中指定。如果我将 MainApp 类更改为:

public class MainApp extends MySprite

或者

public class MainApp extends Sprite implements ITest

但如果我想要两者,我会得到 VerifyError: Error #1014 with MySprite not found 和 ReferenceError: Error #1065。

有任何想法吗?

4

2 回答 2

1

我有同样的问题。实际上,即使您从 RSL 中实现 RSL 接口的类扩展,它也会继续出现此错误。看起来 rsl 需要一些时间来加载并被播放器解释。如果您将在第二个框架中使用封装在 rsl 中的类或接口,它们将正常工作。他们如何在第一帧中无法正常工作。

我的解决方案,与我的案例有关: 1) 使用外部库 rsl.swf 的主应用程序。2) 一个模块应用程序具有实现 IModule 的主文档类 ModuleBase 都封装在 rsl.swf 中,因此模块应用程序也使用外部库 rsl.swf。3)主要应用程序正在加载模块应用程序并将其转换为ModuleBase。

看起来主应用程序加载模块应用程序 swf 所需的时间足以在 rsl 中初始化/注册类型。

但是在 Flash IDE 中:1) 测试模块应用程序,它具有扩展 ModuleBase 类型的主文档,由 rsl 公开,将以 VerifyError: Error #1014 2) 编译模块应用程序工作正常 3) 编译和测试主应用程序工作得很好

浏览器内部:1) 测试模块应用程序失败并出现 VerifyError: Error #1014 2) 测试主应用程序工作正常

所以我的解决方案是编译扩展一些外部类的模块,并在已经具有 RSL 类型的应用程序中使用它们。

我希望这会对某人有所帮助。

//RSL

package interfaces {
    public interface IModuleFactory
    {
      //...
    }
}

package app.models {
    import interfaces.IModuleFactory;
    public class ModuleBase extends MovieClip implements IModuleFactory
    {
      //...
    }
}

//模块

package {
   import app.models.ModuleBase;
   // main document class
   public class Module extends app.models.ModuleBase
   {
      //..
   }
}

//主应用程序内部的某个地方

protected function onModuleLoaded(event:Event):void
{
        var lInfo:LoaderInfo = event.currentTarget as LoaderInfo;
        setTimeout( function(){ extractFactory(lInfo); },200);

}

protected function extractFactory(lInfo:LoaderInfo):void
{
    if( lInfo )
    {
        if( !(lInfo.content is ModuleBase) )
        {
                trace(lInfo.content ,' is not ModuleBase');
        }

        var m:DisplayObject = lInfo.content;
        if( !(m is IModuleFactory) )
        {
                trace(m ,' is not IModuleFactory');
        }
        if(m)
        {
            var factory:Function = (lInfo.content as IModuleFactory).factory;
            if( null != factory)
            {
                factories[key] = factory;
                trace('module loaded',m,key);
                dispatchEvent(new Event('moduleloaded'));
            }else{
                trace('could not get a reference to module factory!');
            }
        }else{
            trace('could not cast to ModuleBase');
        }

    }else{
        trace('could not get a reference to a LodearInfo!');
    }
}
于 2011-03-24T13:32:10.347 回答
0

谢谢你解释这个。使用从 RSL 扩展和实现的模块,您的场景似乎稍微复杂一些。就我而言(模块类 MainApp 实现并扩展了非 RSL 类/接口,并且仅使用 RSL 中的类作为变量)。通过父类(如 ModuleBase)而不是 Module 类来实现接口效果很好。在 Flash IDE 中进行测试时,它甚至不会给我一个错误。

于 2011-03-30T22:46:34.487 回答