2011-06-01 71 views
2

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

例如: [嵌入(源= “../data/gfx/spritesheets/boyHero.png”)]公共静态VAR boyHero:类;

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

我修改了我的.ini文件,使Flash Builder 4的内存分配变得更好。它是目前定为:

-Xms512m -Xmx1024m

,而我在这,这里是我已经安装了规格/插件:

Flash Builder的V4.0起(建272416) JNA库3.2.7 Subclipse的插件1.6.17 颠覆客户端适配器1.6.12 颠覆JavaHL本地库1.6.15 SVNKit LIB 1.3.5.7406

MAC OSX 10.6.7 v 2.53 GHz的英特尔Core 2 Duo 4GB DDR

我的问题:

1)是,我已经选择了我处理在游戏中资产的方式,路径的问题?我正在使用SWFLoader加载的一些资源(如swf教程)进行流式传输。我可以为所有资产走这条路线......但是,我应该吗?这是处理磁盘游戏的正确方法吗? (游戏在QA机器上安装时运行顺畅......)

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

非常感谢! -J。

回答

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类可以让您找到资产,直到您确定完成了它们。 (你可能已经知道了)

无论如何,当你决定你需要在游戏中这些资产,您使用装载机的一个实例装载它们(据推测,在某处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; 

希望这足以让你在正确的轨道上。很多时候,我在运行时加载的资源文件是在网上,但我不明白为什么它不应该工作,以同样的方法适用于从磁盘获取资产的时间。让我知道,如果你有任何问题 - 我很抱歉,如果我不是非常清楚,我想你知道,足以填补空白:)

祝你好运吧!

+0

您好伊恩,我要感谢你的建议。这是唯一的解决方案,让我度过了可怕的OOM错误。非常感激!! – Jason 2011-07-21 18:36:04

+0

没有问题:)如果你喜欢这个答案,那么点击复选标记接受它。谢啦! – Ian 2011-07-25 14:25:18

+0

对不起,花了我一年的时间终于给你勾选了!完全忘了这个!我还写了一个快速的职位,遮住了我的行动路线,根据您的反馈...也许这将帮助别人:[链接](http://jasoneleon.blogspot.com/2011/07/out-of-memory-错误的闪光建设者,4.html) – Jason 2012-05-19 18:32:18