2011-03-13 57 views
1

我想将一个RSL库加载到使用Flash CS5 IDE开发的Flash动画中,该Flash动画扩展了自定义类并实现了一个接口。我已经将问题简化为最简单的设置,并发现我可以让我的主类扩展另一个类或实现一个接口,但如果我想加载RSL,则不能同时进行这两个操作。闪存与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库也非常简单 - 只有一个带方形图的符号。它在actionscript设置中指定。 一切运行良好,如果我改变MainApp类:

public class MainApp extends MySprite 

public class MainApp extends Sprite implements ITest 

但是如果我想这两个我得到的VerifyError:错误#1014 MySprite的未发现的ReferenceError:错误#1065 。

任何想法?

回答

1

我有同样的问题。实际上,即使您从RSL中的类实现RSL的接口扩展,它也会继续出现此错误。 它看起来像rsl需要一些时间来加载并由玩家解释。 如果您将在第二帧中使用封装在rsl中的类或接口,它们将正常工作。他们在第一帧中怎么样都不能正常工作。

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

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

不论如何内部闪存IDE: 1)测试模块应用程序,它具有延伸ModuleBase一种类型的主文档,由RSL曝光,将在的VerifyError结束:错误#1014 2)编译模块应用工作得很好 3)编译和测试的主要应用工作得很好

内的浏览器: 1)测试模块应用未能与的VerifyError:错误#1014 2)测试的主要应用正常工作

所以我的解决办法是编译扩展som的模块e外部类并在具有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!'); 
    } 
} 
0

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

相关问题