2011-03-13 79 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中測試時,它甚至不會給我一個錯誤。