情况如下。目前我正在开发一款包含大量位图资产的AIR游戏。我想定位几个平板电脑(iPad,Xoom,其他),因此,我正在考虑以不同的ppi完成资产,以便在设备之间获得更多的视觉一致性。我并不太关心分辨率,因为我将使用滚动来处理不适合屏幕的资产;但无论装置如何,单位,建筑物,敌人都应该看起来几乎相同。
问题是:
到目前为止,我想到的唯一想法是为每个设备定位一个应用程序文件(或实际上是ppi),它会提取一个与设备的ppi相对应的大位图注册表。对于所有这些应用程序,静态注册表类基本相同,只是[Embed]
指向的文件名(显然是类名)。
答案 0 :(得分:0)
如果您希望为每种设备类型设置特定的资产集,我认为您走在正确的轨道上。我过去做过这种方式的方法是使用rake
脚本,但任何make
- 类似/ 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;
}
脚本会运行文件夹/文件并在/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;
....
}
}
在初始化代码中,您可以确定正在运行的设备或仅针对特定设备进行预编译,并实例化所需的dpi。您只需在代码中的其他位置传递对IAssetSet的引用,并根据IAssetSet.DPI找出要执行的操作。
这是一种方法,但还有其他方法。
另一种方法是将源图像嵌入到最高DPI,然后在应用程序加载时,将它们在内存中缩小到所需的DPI和dispose()
原件。
现在使用Stage3D以及像Starling和nd2d这样的框架更加可行的另一种方法,你可以放心让GPU - 这真的很擅长这种扩展 - 完成大部分真正可行的繁重工作传统的合成。
我认为,如果您使用的是传统合成,那么您可能会使用专门根据您需要调整大小的资产来提升性能,而不是尝试动态调整它们的大小。 Flash有时会在奇怪的时间和坦克性能上重新生成这些资产的内部表示,这有点奇怪。可能最好的方法是利用Stage3D / Starling / nd3d,但是如果你有一个非平凡的代码库,那么在游戏中此时切换渲染引擎可能是一项非常重要的任务...
至少,那是我的两分钱。也许其他人有过不同的经历。