0

情况如下。目前我正在开发一个包含大量位图资源的 AIR 游戏。我想针对几款平板电脑(iPad、Xoom 等),因此,我正在考虑在不同的 ppi 中完成资产,以便在设备之间获得更多的视觉一致性。我不太关心分辨率,因为我会使用滚动显示不适合屏幕的资产;但是无论使用何种设备,单位、建筑物、敌人看起来都应该差不多。

问题是:

  • 这可以做到吗?如何(基于打包器?)
  • 这样做的最好方法是什么
  • 我应该打扰吗?

到目前为止,我想到的唯一想法是为每个目标设备(实际上是 ppi)创建一个应用程序文件,该文件会拉出一个对应于设备 ppi 的大位图注册表。对于所有这些应用程序,静态注册表类本质上是相同的,不同之处仅在于[Embed]指向的文件名(显然还有类名)。

4

1 回答 1

0

如果您想为每种设备类型提供特定的资产集,我认为您走在正确的轨道上。我过去这样做的方式是使用rake脚本,但任何你符合的make-like/ -like 实用程序都可以。ant本质上,在项目编译之前运行的任务之一是挖掘文件结构并以编程方式构建这些帮助类;它有助于避免手工构建这些映射的单调性。一旦您获得了一组重要的资产,这可能会让人感到麻木。

在我的项目中,我会有这样的结构:

/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 确定要做什么。

这是一种方法,但还有其他方法。

另一种方法是以最高 DPI 存储嵌入源图像,然后在应用程序加载时,将它们在内存中缩小到所需的 DPI 和dispose()原始图像。

另一种方法,现在使用 Stage3D 和 Starling 和 nd2d 等框架更可行,您可以让 GPU(非常擅长进行这种缩放)完成传统合成真正可行的大部分繁重工作.

我认为,如果您使用的是传统合成,那么您可能会使用专门针对您需要的资产进行一些性能提升,而不是一直尝试动态调整它们的大小。Flash 有时会有点奇怪,因为它会在奇怪的时间重新生成这些资产的内部表示并降低性能。可能最好的方法是利用 Stage3D/Starling/nd3d,但是如果您构建了一个非平凡的代码库,那么在游戏的这个阶段切换渲染引擎可能是一项不平凡的任务......

至少,那是我的两分钱。也许其他人有不同的经历。

于 2012-04-22T03:05:32.117 回答