0

状況は以下の通りです。現在、多くのビットマップ アセットを含む AIR ゲームを開発しています。複数のタブレット (iPad、Xoom、その他) をターゲットにしたいので、デバイス間でより視覚的な一貫性を持たせるために、アセットを異なる ppi で実行することを検討しています。画面に収まらないアセットにはスクロールを使用するため、解像度についてはあまり気にしません。ただし、ユニット、建物、敵は、デバイスに関係なくほぼ同じに見えるはずです.

質問は:

  • これを行うことができ、どのように(パッケージャーベース?)
  • これを行う最善の方法は何でしょうか
  • 私も気にする必要がありますか?

これまでに頭に浮かんだ唯一の考えは、デバイスの ppi に対応する大き​​なビットマップ レジストリをプルする、対象となる各デバイス (または実際には ppi) 用のアプリケーション ファイルを用意することです。[Embed]静的レジストリ クラスは、ポイントするファイル名 (および明らかにクラス名) が異なるだけで、これらすべてのアプリケーションで本質的に同じです。

4

1 に答える 1

0

デバイスの種類ごとに特定のアセットのセットが必要な場合は、正しい方向に進んでいると思います。私が過去にこれを行った方法は、rakeスクリプトを使用することですが、あなたが順応できる任意のmake-like/ -like ユーティリティで実行できます。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;
}

スクリプトは、フォルダー/ファイルをスクレイプして実行し、 のようなフォルダーに actionscript クラスを生成します/src/assets。のようなもの

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;
        ....
    } 
}

初期化コードでは、実行しているデバイスを決定するか、特定のデバイス用にのみプリコンパイルし、必要な dpi をインスタンス化します。コードの他の場所では、IAssetSet への参照を渡し、IAssetSet.DPI に基づいて何をすべきかを判断するだけです。

これは 1 つの方法ですが、他にも方法があります。

別のアプローチとして、ソース イメージを最高の DPI で埋め込み保存し、アプリケーションの読み込み時にメモリ内で目的の DPI と元のイメージにダウンスケールする方法がありますdispose()

Stage3D と Starling や nd2d などのフレームワークで最近より実行可能になっている別のアプローチでは、このスケーリングを行うのが非常に得意な GPU に、従来の合成で実際に実現可能な重労働のほとんどを任せることができます。 .

従来の合成を使用している場合は、アセットを常に動的にサイズ変更するのではなく、必要なサイズに合わせて特別にサイズ変更したアセットを使用すると、パフォーマンスが向上するように見えると思います。Flash は、奇妙なタイミングでこれらのアセットの内部表現を再生成し、パフォーマンスを低下させることについて、少し奇妙になることがあります。おそらく最善の方法は Stage3D/Starling/nd3d を活用することですが、重要なコードベースが構築されている場合、ゲームのこの時点でレンダリング エンジンを切り替えるのはおそらく重要な作業になります...

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

于 2012-04-22T03:05:32.117 に答える