2012-04-21 5 views
0

状況は次のとおりです。現在、たくさんのビットマップアセットを含むAIRゲームを開発中です。私はいくつかのタブレット(iPad、Xoom、その他)をターゲットにしたいので、デバイス間で視覚的に一貫性を持たせるために、異なるPPIでアセットを作成することを検討しています。画面に収まらないアセットにスクロールを使用するため、解像度についてはあまり気にしません。ユニット、建物、敵は、デバイスに関係なくほぼ同じに見えるはずです。私も気にする必要があり、この パッケージャベースの資産埋め込み

  • を行うための最善の方法だろう何

    • これが行われ、どのように(パッケージャベース?)することができ
    • 質問はありますか?

    これまで私の考えで考えていたのは、デバイスのppiに対応するビッグビットマップレジストリをプルする各デバイスのターゲットファイル(または実際にはppi)のアプリケーションファイルを持つことだけでした。静的なレジストリクラスは、[Embed]が指し示すファイル名(およびクラス名は明らかに異なる)だけ異なるこれらのアプリケーションのすべてに対して本質的に同じです。

  • 答えて

    0

    それぞれのデバイスタイプに特定のアセットセットを使用したいと思っていれば、あなたは正しい方向に進んでいると思います。これまで私が行ったことは、rakeスクリプトを使用することですが、あなたが準拠している任意のmake-/antのようなユーティリティを使用することです。基本的に、プロジェクトのコンパイルの前に実行されるタスクの1つは、ファイル構造を掘り下げて、これらのヘルパークラスをプログラムで構築することです。これらのマッピングを手作業で構築するという単調さを避けるのに役立ちます。それはいったんあなたが些細でない資産を得ると、麻痺することがあります。私はこのような構造でなければならない私のプロジェクトで

    /ProjectRoot 
        /src 
    
        /imgs 
         /132dpi 
          /unit1.jpg 
          /unit2.jpg 
          . 
         /160dpi 
          /unit1.jpg 
          /unit2.jpg 
          . 
         /264dpi 
          /unit1.jpg 
          /unit2.jpg 
          . 
         /326dpi 
          /unit1.jpg 
          /unit2.jpg 
          . 
    

    を私は通常、スクリプトが窮地を実行します、

    public interface IAssetSet { 
        function get DPI():uint; 
        function get Unit1():BitmapData; 
        function get Unit2():BitmapData; 
    } 
    

    のようなものをすべての私の資産が遵守でしょういくつかのインタフェースを持っているでしょうフォルダ/ファイルを作成し、/src/assetsのようなフォルダにactionscriptクラスを生成します。初期化コードで

    public class AssetSet132dpi implements IAssetSet { 
    
        public function get DPI():uint { return 132; } 
    
        [Embed("img/132dpi/unit1.jpg")] 
        private var _unit1Class:Class; 
        private var _unit1:BitmapData; 
        public function get Unit1():BitmapData { return _unit1; } 
    
        [Embed("img/132dpi/unit2.jpg")] 
        private var _unit2Class:Class; 
        private var _unit2:BitmapData; 
        public function get Unit2():BitmapData { return _unit2; } 
    
        ... 
    
        public function AssetSet132dpi() { 
         _unit1 = BitmapData(new _unit1Class()).bitmapData; 
         _unit2 = BitmapData(new _unit2Class()).bitmapData; 
         .... 
        } 
    } 
    

    のようなものは、あなたが上で実行されているどのようなデバイスを決定したり、特定のデバイスに対してのみプリコンパイルし、必要解像度をインスタンス化します。あなたのコードのどこにいても、IAssetSetへの参照を渡し、IAssetSet.DPIに基づいて何をすべきかを理解するだけです。

    これは1つのアプローチですが、他にもあります。

    もう1つのアプローチは、元の画像を最高のDPIに格納してからアプリケーションのロード時に格納し、メモリで目的のDPIにダウンスケーリングし、dispose()オリジナルにすることです。

    最近、Stage3DやStarlingやnd2dのようなフレームワークで実行可能なもう1つのアプローチでは、このスケーリングを実行するのが本当にうまくいくGPUに伝統的な合成で実現可能です。

    従来のコンポジットを使用している場合は、常に動的にサイズを変更するのではなく、必要なサイズのアセットを使用してパフォーマンスを向上させるように見えます。奇妙な時期やタンク性能で、これらの資産の内部表現を再生成することについては、Flashが少し奇妙になることがあります。おそらく最善のアプローチはStage3D/Starling/nd3dを活用することですが、自明なコードベースが構築されていれば、ゲームのこの時点でレンダリングエンジンを切り替えるのは簡単な作業ではないでしょう...

    少なくとも、それらは私の2セントです。たぶん誰かが別の経験をしているかもしれません。

    +0

    徹底的な回答といくつかの良いアイデアをありがとう。 TexturePackerのようなツールを使用することで、削り取り/建物が部分的に回避できると思います(できるだけ少ない時間でアップロードする方が良いと思われます)。しかし、私の主な関心は現在パフォーマンスです。 GPUをサポートしたSuper3ed Stage3D - デバイス上では、非常に単純な低レベルのテストでさえ、あまりうまく動作しません。 –

    関連する問題