мне кажется, что пришло время разбить ваши активы на отдельные файлы и загрузить их во время выполнения с диска.Это должно освободить место при редактировании кода, чтобы 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;
Надеюсь, этого достаточно, чтобы вы встали на правильный путь.Большую часть времени, когда я загружаю файл ресурсов во время выполнения, он находится через Интернет, но я не понимаю, почему не следует применять тот же метод для получения ресурсов с диска.Дайте мне знать, если у вас есть вопросы - извините, если я не был до конца ясен, я полагаю, вы знаете достаточно, чтобы заполнить пробелы:)
Удачи с этим!