Управление активами в Adobe Air для 2d игры - PullRequest
2 голосов
/ 01 июня 2011

Я создаю приложение Adobe AIR (приключенческая игра 2d Platformer) с использованием среды разработки Flash Builder 4, которая будет установлена ​​на компакт-диске для установки. Я вложил большинство игровых ресурсов в статический класс, чтобы он был простым и организованным. Таким образом, я могу повторно использовать активы и поменять их местами без особых усилий.

Пример: [Embed (source = "../data/gfx/spritesheets/boyHero.png")] общедоступная статическая переменная boyHero: Class;

В первые дни проектов все шло по плану. Однако, когда размер проекта превысил 28 МБ, я начал сталкиваться с ошибками нехватки памяти. Это происходит, когда я добавляю новые ресурсы, некоторое время делаю рефакторинг или добавляю новые классы. Как только я получаю эту ошибку, я могу перезапустить 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 Subversion JavaHL Native Lib 1.6.15 SVNKit lib 1.3.5.7406

Mac OSx v 10.6.7 Intel Core 2 Duo 2,53 ГГц 4 ГБ памяти DDR

Мои вопросы:

1) Проблема в пути, который я выбрал для способа обработки игровых ресурсов? Я транслирую некоторые ресурсы, такие как учебные swfs, которые загружаются через SWFLoader. Я мог бы пойти по этому пути для всех активов ... но я должен? Это правильный способ обращаться с дисковой игрой? (Игра запускается без проблем при установке на машины QA ...)

2) Если встраивание статических ресурсов не является проблемой, это ошибка FB4? Куда мне обращаться за дополнительной информацией?

Заранее очень большое спасибо! -J.

1 Ответ

3 голосов
/ 03 июня 2011

мне кажется, что пришло время разбить ваши активы на отдельные файлы и загрузить их во время выполнения с диска.Это должно освободить место при редактировании кода, чтобы FB4 не волновался.Я только что закончил игру на Facebook, в которой было множество ресурсов, и в итоге я поместил все звуки в их собственный SWF, всю тяжелую графику в свои собственные SWF, а затем загрузил их во время выполнения.Вот разбивка ключевых моментов:

Для меня я использовал Flash CS5 для генерации ресурсов и экспортировал символы для ActionScript в первом кадре.Я просто экспортировал фильм, Флэш передал бы мне мои активы SWF, и я был в порядке.В качестве альтернативы, вы можете иметь простой файл AS с кучей встроенных тегов и скомпилировать его в свой собственный SWF-файл, используя ant или FB4.Это действительно то же самое в конце дня, если вы помещаете свои активы в SWF.

Таким образом, вместо того, чтобы файл, полный тегов Embed, соответствовал остальной части вашей игровой логики, выу вас есть файл, полный имен символов, чтобы вы могли получить их, когда они вам нужны:

//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 вы держитесь за объект applicationDomain загруженного SWF.Домен приложения - это ваша точка доступа ко всем определениям символов в 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;

Надеюсь, этого достаточно, чтобы вы встали на правильный путь.Большую часть времени, когда я загружаю файл ресурсов во время выполнения, он находится через Интернет, но я не понимаю, почему не следует применять тот же метод для получения ресурсов с диска.Дайте мне знать, если у вас есть вопросы - извините, если я не был до конца ясен, я полагаю, вы знаете достаточно, чтобы заполнить пробелы:)

Удачи с этим!

...