gpt4 book ai didi

flash - Adobe Air 中的 2d 游戏 Assets 管理

转载 作者:行者123 更新时间:2023-12-04 06:24:32 32 4
gpt4 key购买 nike

我正在使用 Flash Builder 4 IDE 构建 Adob​​e AIR 应用程序(2d 平台冒险游戏),该应用程序将打包在 CD 上以供安装。我已将大部分游戏 Assets 嵌入到一个静态类中,以保持其简单和有条理。通过这种方式,我可以重用 Assets 并在不进行太多挖掘的情况下交换它们。

例子:
[Embed(source = "../data/gfx/spritesheets/boyHero.png")] public static var boyHero:Class;

在项目的早期,一切都按计划进行。然而,随着项目的发展超过 28MB,我开始遇到内存不足的错误。当我添加新 Assets 、重构一段时间或添加新类时,就会发生这些情况。一旦出现此错误,我可以重新启动 FB,然后再工作 15-20 分钟。

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

-Xms512m
-Xmx1024m

当我在做的时候,这里是我已经安装的规范/插件:

Flash Builder v 4.0(内部版本 272416)
JNA 库 3.2.7
子剪辑插件 1.6.17
颠覆客户端适配器 1.6.12
颠覆 JavaHL Native Lib 1.6.15
SVNKit 库 1.3.5.7406

Mac OSx v 10.6.7
2.53 GHz 英特尔酷睿 2 双核
4GB DDR

我的问题:

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

2) 如果静态 Assets 的嵌入不是问题,这是 FB4 错误吗?我应该去哪里了解更多信息?

非常感谢!
-J。

最佳答案

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

对我来说,我使用 Flash CS5 生成 Assets ,并在第一帧中导出 ActionScript 的符号。我只是导出电影,Flash 会把我的 Assets SWF 交给我,我很高兴。或者,您可以拥有带有大量嵌入标签的简单 AS 文件,并使用 ant 或 FB4 将其编译为自己的 SWF。归根结底,只要您将 Assets 放入 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";

在某个地方,您还保留了 Assets 文件名:
//AssetFiles.as

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

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

无论如何,当您决定在游戏中需要这些 Assets 时,您可以使用 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 的对象。 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;

}

然后,当您想要获取特定 Assets 时,您将使用某种 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;

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

祝你好运!

关于flash - Adobe Air 中的 2d 游戏 Assets 管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6195131/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com