5

Haxe が NME/OpenFL で得たものと同様に、AS3 開発から移行する際の大きな問題は資産です。Haxe は as3 に似ており、OpenFL は使い慣れた API を提供しようとしますが、SWF サポートの欠如は多くの開発者を怖がらせます。このトピックに関する調査の結果、現在の SWF は脆弱でバグが多く、Haxe で実行するには SWF ファイルに多くの編集が必要であることがわかりました。

問題は、OpenFL アプリで SWF アニメーションをどのように使用するか、または使用しない場合、レンダリング時間、プロセッサ時間、およびファイル サイズに関して見つけた最善の解決策は何かということです。

4

2 に答える 2

11

調査に多くの時間を費やし、他の開発者に質問した結果、アニメーションに SWF アセットを使用する代わりに可能な代替案の小さなリストをまとめました。SWF アニメーションのサポートが弱いために同様の問題を抱えている他の開発者に役立つことを願っています。

注: すべての方法は、私にとって重要な 3 つの要因 (すべてのプラットフォームでの可用性、パフォーマンス、アセットのファイル サイズ) を考慮して選択されました。したがって、すべての可能な方法が含まれているわけではありません。

テスト済み: HTML5、Android、iOS

  • SWF アニメーションHaxe/OpenFL では可能ですが、いくつかのルールがあります。トゥイーンなし - すべてのアニメーションはフレーム単位です。ベクトル アートはビットマップとしてキャッシュするか、ビットマップとして保存するか、ビットマップ シーケンスとして事前にレンダリングする必要があります。これは、一部のプラットフォーム (neko など) では、ベクトル アートが醜いエッジのラスターに変換されるためです。MovieClip をグラフィックスとして表現する場合、またはその逆の場合にいくつかのバグが報告されましたが、HTML5、Flash、iOS、Android のリリースではバグに気付きませんでした。ネストされたアニメーションは、ループするとフレームをスキップすることがあります (これも確認されませんでした。NME/OpenFL の古いリリースで行われた可能性があります)。これは、ファイル サイズとプラットフォームの利用可能性を考慮すると、コンテンツをアニメーション化するためのかなり良い方法だと思いますが、Haxe サポートの要件を満たすためにすべてのアセットを編集するのは頭痛の種です。そして、これらのアセットを後で再利用するのは楽しいことではありません。

  • スプライト シート アニメーション。レンダリング パフォーマンスが高いため、主に HTML5 ターゲットに使用されます。これは openGL 標準に直接基づいているため、このメソッドはすべての openGL ターゲットに適用する必要があります。アイデアは、1 つの大きなファイルを保持し、複数の小さなファイルを開く/読み込む時間を節約することです。パフォーマンスは良好で、テスト済みのすべてのプラットフォームで動作しますが、ファイル サイズがすぐに手に負えなくなり、オブジェクト サイズのサイズが変化するアニメーションにはほとんど使用できません。実行時に変換マトリックスを編集してレンダリング パフォーマンスを向上させます。

  • フレーム シーケンス別名 PNG シーケンス アニメーション。個人的なお気に入り。すべてのプラットフォームで高速に動作し、アニメーションを事前にレンダリングしたり (上記の他の方法と同じように)、BitmapData 配列に変換したり、ストリームロードしたりすることできます。アニメーションには多くのディスク容量が必要ですが、使用する前にアセットをロードすることでソフト化できます (HTML5、SWF)。モバイル デバイスでは問題になりません。市場では 1 ~ 2GB のアプリでも問題ありません。私が自分で見つけた大きな利点は、このタイプのアセットを他の開発標準 (C++、Java、cocos2d) に使用でき、必要に応じてスプライト シートとして保存できることです (たとえば、cocos2d、HTML5 は他の何よりもスプライト シートを好むように、 Roger Engelbert による公式本 COCOS2DX)。
    この柔軟性により、良好なパフォーマンスが許容できるファイル サイズになります。私は、上記のどの方法よりもこの方法を好みます。

  • ボーン アニメーション - PNG 配列 + プロパティ リスト。もう 1 つのアプローチは、アニメーション化されたオブジェクトの個別の画像と、すべてのフレームのすべての画像マトリックス データを使用することです。そうすれば、最小限のディスク容量を使用して、何千ものアニメーションを作成できます。欠点は、より複雑なアニメーションの場合にアニメーションをネストするのが難しい (不可能ではない) こと、一定のマトリックス変換によって表示リスト上のアクティブなアニメーションの数が制限されること (HTML5 では恐ろしい方法であり、他のプラットフォームでは適切に保持されている)、アセットの再利用性がほとんどないことです。通常、このタイプにエクスポートされたのは同じ古き良き SWF アセットであるため、ボーン アニメーション自体ではなく FLA を編集するのが理にかなっています。

グラフィックをアニメーション化するには多くの方法があり、他の方法よりもうまく機能する方法もありますので、コメントを残したり批判したりしてください.

于 2013-08-20T05:18:49.043 に答える
5

この質問は時代遅れかもしれません。ほんの 5 分前に Haxe/OpenFL で C++ アプリをコンパイルしましたが、SWF アニメーション (トゥイーン付き) を問題なく動作させました。

これは gif の記録です: https://imgflip.com/gif/7l02f

そのアニメーションを含む「library.swf」というアセットがあり、クラス「Oluv」としてエクスポートされました

これには、現在無料の「swf」ライブラリが必要で、「haxelib install swf」でインストールできます。

私の例では、これを application.xml ファイルに追加しました。

<haxelib name="swf" />
<library id="oluvLib" path="assets/library.swf" type="swf"/>

次に、これを標準の OpenFL テンプレート プロジェクトに入れます。

Assets.loadLibrary("oluvLib", swfAssetsLoaded);

private function swfAssetsLoaded(library:AssetLibrary):Void {
    var oluv = Assets.getMovieClip("oluvLib:Oluv");
    addChild(oluv);
    oluv.x = (stage.stageWidth - oluv.width) / 2;
    oluv.y = (stage.stageHeight - oluv.height) / 2;
}

Tweens は neko ターゲットでは動作しないようですが、C++ とフラッシュ (もちろん) では正常に動作します。

于 2014-03-17T18:33:47.053 に答える