Adobe Air的资产管理为2D游戏

时间:2011-06-01 00:50:00

标签: flash actionscript-3 air flash-builder

我正在使用Flash Builder 4 IDE构建一个Adobe AIR应用程序(2d平台冒险游戏),它将打包在CD上进行安装。我已经将大部分游戏资产嵌入到静态类中,以保持简单和有条理。通过这种方式,我可以重用资产并交换它们,而无需进行太多挖掘。

例如: [嵌入(来源=“../data/gfx/spritesheets/boyHero.png”)] public static var boyHero:Class;

在项目的早期阶段,一切都按计划进行。然而,随着项目增长到28MB以上,我开始遇到Out Of Memory错误。当我添加新资产,重构一段时间或添加新类时会发生这些情况。一旦出现此错误,我可以重新启动FB,然后再工作15-20分钟。

我修改了我的.ini文件,提升了Flash Builder 4的内存分配。它目前设置为:

-Xms512m -Xmx1024m

虽然我喜欢它,但这是我安装的规格/插件:

Flash Builder v 4.0(内部版本272416) JNA图书馆3.2.7 subclipse插件1.6.17 subversion客户端适配器1.6.12 颠覆JavaHL Native Lib 1.6.15 SVNKit lib 1.3.5.7406

Mac OSx v 10.6.7 2.53 GHz Intel Core 2 Duo 4GB DDR

我的问题:

1)我选择的路径问题是我处理游戏内资产的方式吗?我正在流式传输一些资源,例如通过SWFLoader加载的教程swfs。我可以为所有资产走这条路......但是,我应该吗?这是处理磁盘游戏的正确方法吗? (当安装在QA机器上时,游戏顺利运行......)

2)如果嵌入静态资产不是问题,这是FB4错误吗?我应该去哪里获取更多信息?

非常感谢! -J。

1 个答案:

答案 0 :(得分:3)

听起来我觉得是时候将资产分解成单独的文件并在运行时从磁盘加载它们。在你编辑代码时应该释放一些空间,这样FB4就不会吓坏了。我刚刚完成了一个拥有大量资产的Facebook游戏,我最终将所有声音放在他们自己的SWF中,所有重型图形都放在他们自己的SWF中,然后在运行时加载它们。以下是关键点的细分:

对我来说,我使用Flash CS5生成资源,并在第一帧中导出actionscript的符号。我只是导出电影,Flash会把我的资产交给SWF,我很乐意去。或者,您可以拥有包含大量嵌入标记的简单AS文件,并使用ant或FB4将其编译为自己的SWF。只要您将资产投入SWF,这在一天结束时就是同样的事情。

通过这种方式,您可以拥有一个充满符号名称的文件,而不是让文件中包含与其余游戏逻辑相同的嵌入标记,以便您可以在需要时获取它们:

//GraphicalAssets.as

//the linkage for this asset in your asset swf would need to match 'hero_guy_graphic'
public static var HERO_GUY_GRAPHIC:String = "hero_guy_graphic";

在某处您还可以保留资产文件名称:

//AssetFiles.as

public static var CHARACTER_ASSETS:String = "thePathToTheCharacterAssetsFile.swf";

在继续之前,将我要描述的功能放入某种AssetManager类中是个好主意。每次游戏需要资产时,您都不希望加载文件,因此AssetManager类会为您提供一个挂起资产的位置,直到您确定已完成它们为止。 (你可能已经知道了)

无论如何,当你决定在游戏中需要这些资产时,你可以使用Loader实例加载它们(可能是在AssetManager类的某个地方):

var loader:Loader = new Loader();
var loader.contentLoaderInfo.addEventListener(Event.COMPLETE, handleAssetsLoaded);
//add some error event listeners here too...

var request:URLRequest = new URLRequest(pathToMyAssetsFile);
loader.load(request);

handleAssetsLoaded函数中,您将挂起已加载的SWF的applicationDomain对象。 applicationDomain是SWF中所有符号定义的访问点。

private function handleAssetsLoaded(evt:Event):void {

    //hang on to this for later         
    var appDomain:ApplicationDomain = (evt.target as LoaderInfo).applicationDomain;

    //a good way to do that would be have a private array where you hang on to them
    //_appDomains["TheNameOfMyAssetFile.swf"] = appDomain;

}

然后,当您想要获取特定资产时,您将使用某种getAsset()方法:

public function getAsset(assetName:String, fileName:String):* {

    var assetFileAppDomain:ApplicationDomain = _appDomains[fileName] as ApplicationDomain;
    var assetClassDefinition:Class = assetFileAppDomain.getDefinition(assetName) as Class;
    return new assetClassDefinition();

}

最后,当你想在你的游戏中获得HeroGuy时,你会有一些看起来像这样的电话:

//assuming AssetManager is a singleton that we can get with AssetManager.instance ...
var heroGuyGraphic:MovieClip = AssetManager.instance.getAsset( GraphicalAssets.HERO_GUY_GRAPHIC, AssetFiles.CHARACTER_ASSETS ) as MovieClip;

希望这足以让你走上正轨。大多数情况下,当我在运行时加载资产文件时,它是通过网络进行的,但我不明白为什么不应该使用相同的技术从磁盘获取资产。如果您有任何问题,请告诉我 - 如果我不是非常清楚,我很抱歉,我认为您已经足够了解填补空白:)

祝你好运!