2011-12-08 18 views
1

私は、molehillの利点を利用してFP11で動作するユニバーサルグラフィックスエンジンを作成しています。また、古いソフトウェアブリッティングを使用するFP10でも動作します。異なるバージョンのFlash Player用に異なるコード

だから私はこれを達成するための最善の方法は何ですか?

私はFP11用にswfをコンパイルして、プレーヤーのバージョンが11でない場合は新しいクラスを使用しないと思っていましたが、すべて正常に動作します。しかし、私は間違っていました。私が驚いたことに、呼び出されていなくてもインポートされたFP11ライブラリを使ってコードを実行すると、 "VerifyError:Error#1014。class Could not find class flash.display3D :: Context3D"エラーが発生します。

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

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

他の方法はありますか?

答えて

2

Flashを使用している場合(Flexや他のツールとは対照的に)、唯一のオプションは条件付きのコンパイルである可能性があります。私がCS5でこれに対処しなければならなかったとき、私は他のものを見つけることができませんでした。

私がやったことは、様々な構成のいくつかの定数を定義してから、いくつかのバージョンの.swfをコンパイルしたことです。ブラウザのプレーヤー検出コードに基づいて正しい.swfファイルをロードしました。あなたがNewgroundsなどの場所であなたの.swfをしたい場合は、実際には混乱です。

1

flash apisは前方互換性がありません。あなたがフラッシュ11 apiをしたい場合は、フラッシュ11 + swfをする必要があります。この理由は、swf 10が自分自身のStage3Dクラスを作成できることです。 swf 11の組み込みクラスと突然衝突すると、後方互換性が損なわれます。後方互換性、後方互換性は1つしか設定できません。

1

編集

申し訳ありませんが、私はあなたがライブラリの異なるバージョンをサポートしないことに気づきませんでした。この場合、FPはSWFのバイトコードを処理し、未知の参照が見つかるとVerifyErrorをスローします。もちろん、getDefinitionByName()と動的アクセスを使用できますが、それはと非常にです。

個別にサポートされているコードの量を最小限に抑えるには、SWCの主な機能とバージョンに依存する機能を持つSWFを使用できます。したがって、初期化の段階で、libのメインクラスがFPバージョンをチェックし、 。


これは、動的リンクと呼ばれ、方法がありますされています

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

  2. このインターフェイスの2つの独立したのインプリメンテーションを作成します。最初のAPIは新しいAPIを使用し、2番目のAPIは使用しません(プレースホルダだけでなく、代わりの実装かもしれません)。後でこれらの実装をSWFにコンパイルする必要があるため、Spriteまで拡張するメインクラスが必要です。このトリックを行う最も簡単な方法は、これらのメインクラスが私たちのインターフェースを実装するようにすることです(つまりpublic class MyImplementationA extends Sprite implements MyInterface...MyImplementationBと同じ)。彼らはちょうど空のSpritesになりますが、インタフェースメソッドを含んでいます。

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

  4. ルートアプリケーションをコンパイルするときは、通常のライブラリ(-library-pathコンパイラパラメータまたはIDEの「コードに結合」タイプ)にlib-intf.swcを含めるようにしてください。バージョン依存のクラスは一切含めないでください。したがって、ルートアプリケーションでは、バージョンに依存しないインターフェイスへの参照だけがあります。アプリケーションが起動すると、FPのバージョンをチェックし、それに応じてLoaderクラスを使用して適切なSWFをロードします。あなたはそれをメインのアプリケーションドメインにロードしなければなりません。デフォルトのオプションはmore detailsです。

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

  6. これで完了です。これで、実装はversionDependentImpl.someMethod()になりました。もちろん、someMethodMyInterfaceに定義する必要があります。

ここでは、SWFファイルから実装を動的に読み込む方法があります。ルートアプリケーションはこのSWF内部のクラスについて何も知らないものの、ルートクラスのアプリケーションにコンパイルしたインターフェイスを実装するため、そのクラスのメソッドを使用できます。

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

関連する問題