1

カスタム クラスを拡張し、インターフェイスを実装する Flash CS5 IDE で開発されたフラッシュ アニメーションに RSL ライブラリをロードしようとしています。問題を最も単純なセットアップに減らしたところ、メイン クラスで別のクラスを拡張したり、インターフェイスを実装したりできますが、RSL をロードする場合に両方を同時に実行することはできません。

拡張する非常に単純なクラスがあります。

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

    public function MySprite() 
    {

    }
}

RSL ライブラリのシンボルである TestSymbol を持つメイン クラス:

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 ライブラリも非常に単純なもので、正方形の描画を含む 1 つのシンボルのみです。これはアクションスクリプト設定で指定されます。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 にカプセル化された 2 番目のフレーム クラスまたはインターフェイスで使用する場合、それらは正常に動作します。最初のフレームでうまく機能していません。

私のケースに関連する私の解決策は次のとおりです。1)外部ライブラリrsl.swfを使用するメインアプリケーション。2) どちらも rsl.swf にカプセル化された IModule を実装するメイン ドキュメント クラス ModuleBase を持つモジュール アプリケーション。そのため、モジュール アプリケーションは外部ライブラリ rsl.swf も使用していました。3) メイン アプリケーションはモジュール アプリケーションをロードし、それを ModuleBase にキャストしていました。

Main アプリケーションがモジュール アプリケーション swf をロードするのに必要な時間は、rsl 内の型を初期化/登録するのに十分な時間のようです。

Flash IDE 内での方法: 1) rsl によって公開された、ModuleBase を拡張するタイプのメイン ドキュメントを持つモジュール アプリケーションをテストすると、VerifyError: エラー #1014 で終了します。 2) モジュール アプリケーションのコンパイルは問題なく動作します。メインアプリケーションは問題なく動作します

ブラウザー内: 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のクラスを変数として使用するだけです)。Moduleクラスの代わりに親(ModuleBaseなど)クラスによってインターフェイスを実装すると、うまく機能します。FlashIDEでテストしてもエラーは発生しません。

于 2011-03-30T22:46:34.487 に答える