2011-06-01 63 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