1

モレヒルの利点を使用して FP11 で動作し、古いソフトウェア ブリッティングを使用して FP10 でも動作するユニバーサル グラフィック エンジンを作成しています。

それで、私はこれを達成するための最良の方法は何ですか?

最初に、FP11 用に swf をコンパイルし、プレーヤーのバージョンが 11 でない場合は新しいクラスを使用しない場合、すべてが正常に動作すると考えました。しかし、私は間違っていました。驚いたことに、呼び出されていない場合でも、インポートされた FP11 ライブラリを使用してコードを実行すると、「VerifyError: エラー #1014。クラス flash.display3D::Context3D が見つかりません」というエラーが発生します。

FP がこのメッセージをスローするのは、存在しないクラスにアクセスしようとしたときだけだと思っていましたが、そうではありません。.swf を実行しようとすると、エラーがスローされます

それで、それを行う方法はありますか?プリローダーを使ってバージョンごとに異なるSWFをロードしようと考えたのですが、2つの異なるSWFを維持・コンパイルするのはかなりややこしいです。

他の方法はありますか?

4

3 に答える 3

1

編集

申し訳ありませんが、ライブラリのさまざまなバージョンをサポートしたくないことに気づきませんでした。この場合は仕方がありません — FP が SWF のバイトコードを処理し、不明な参照を見つけると、VerifyError をスローします。もちろん、getDefinitionByName()動的アクセスを使用できますが、非常に低速です。

個別にサポートされるコードの量を最小限に抑えるために、メイン機能を備えた SWC とバージョン依存機能を備えた SWF を使用できるため、初期化の段階でライブラリのメイン クラスが FP バージョンをチェックし、適切な SWF をロードします。


これは動的リンクと呼ばれ、次の方法があります。

  1. プレーヤーのバージョンに依存するすべての機能のインターフェイスを作成します ( public interface MyInterface...)。このインターフェイスには、バージョンに依存する API への参照を含めないでください。このインターフェイス (単一の .as ファイルの場合もあります) を SWC にコンパイルします (そのままにしておきますlib-intf.swc)。

  2. このインターフェイスの 2 つの独立した実装を作成します。1 つ目は新しい API を使用し、2 つ目は使用しません (単なるプレースホルダーである可能性がありますが、代替の実装である可能性もあります)。後でこれらの実装を SWF にコンパイルする必要があるため、Sprite. このトリックを実行する最も簡単な方法は、これらのメイン クラスにインターフェイスを実装させることです (つまりpublic class MyImplementationA extends Sprite implements MyInterface...、 についても同じですMyImplementationB)。それらは単に空Spritesになりますが、インターフェイス メソッドが含まれます。

  3. これら 2 つの実装を別々のSW F (lib-a.swfおよびlib-b.swf) に個別にコンパイルします。コンパイル時にlib-intf.swc、外部ライブラリとしてインクルードします (-external-library-pathコンパイラ パラメーターまたは IDE の「外部」リンク タイプ)。

  4. ここで、ルート アプリケーションをコンパイルするときに、lib-intf.swc通常どおりライブラリを含めます (-library-pathコンパイラ パラメーターまたは IDE の「コードにマージ」リンク タイプ)。バージョン依存のクラスは一切含めないでください。したがって、ルート アプリケーションでは、バージョンに依存しないインターフェイスへの参照のみが含まれます。アプリケーションの起動時に FP のバージョンを確認し、それに応じて Loader クラスを使用して適切な SWF をロードします。その子ではなく、メイン アプリケーション ドメインにロードする必要があります (これは既定のオプションです。詳細は)。

  5. SWF が読み込まれたら、インターフェイスにキャストします: var versionDependentImpl:MyInterface = loader.content as MyInterface。SWF のメイン クラスは を実装MyInterfaceしているため、このキャストが機能することを思い出してください。

  6. それだけです — これで、実装を使用できます: versionDependentImpl.someMethod(). もちろん、someMethodで定義する必要がありますMyInterface

したがって、ここでの秘訣は、SWF ファイルから実装を動的にロードすることです。ルート アプリケーションはこの SWF 内のクラスについて何も知りませんが、ルート アプリケーションにコンパイルしたインターフェイスを実装するようにしたので、メイン クラスのメソッドを使用できます。

このアプローチはスケーラブルです。たとえば、他のインターフェイスを返すメソッドを持つメイン インターフェイスを定義できます。lib-intf.swcバージョン依存の API を使用しない限り、実装間で共有される具象クラスを に含めることもできます。

于 2013-01-23T11:20:50.150 に答える
1

フラッシュ API は前方互換性がありません。Flash 11 API が必要な場合は、Flash 11+ SWF を作成する必要があります。これは、swf 10 が独自の Stage3D クラスを問題なく作成できるためです。swf 11 のビルトイン クラスと突然競合する場合、下位互換性が失われます。そのため、後方互換性または前方互換性を 1 つだけ持つことができます。

于 2012-01-29T10:55:08.800 に答える