xna /内容管道/资产和屏幕管理

时间:2012-05-08 22:22:03

标签: vb.net xna

我是XNA的新手,这是一个哲学问题。在我看到的大多数示例中,游戏资产被定义为私有类变量,在LoadContent方法中加载,然后使用Draw方法绘制。如果我有一个有很多屏幕的大型游戏,那么在这个类的顶部可能会有相当多的声明。

话虽如此,这是我的问题

  1. 我应该在Texture2D.FromFile()上使用内容管道吗?

  2. 除了加载速度更快之外还有什么其他优势。

  3. 我应该在LoadContent()子项外调用Content.Load(Of T)([some asset name])。

  4. 您如何处理不同屏幕的加载资产?您是否在顶部宣布所有资产?

    先谢谢了,

    埃里克

1 个答案:

答案 0 :(得分:1)

使用内容管道,您可以使用二进制文件编译纹理,从而节省空间,加载时间,并保护您的资产免受编辑/未经授权的使用,如果您愿意的话。另一方面,如果您希望资产可编辑(如纹理包),FromFile()是有效的。该文件必须存在于预期的目录中,当然正常使用。

这是一种很好的做法,但最终决定了您选择加载内容的位置。请记住,内容加载需要从磁盘读取,这不是你想要在每一帧确实做的事情,而不是我们喜欢在游戏中做的事情。您需要设置游戏状态管理,以便在加载屏幕或游戏启动期间完全加载内容,而不是在游戏本身期间。当然,这正是加载屏幕的级别!如果你非常聪明,你可以在玩游戏暂停期间偷偷装入,这是一个银河战士Prime的'门装载'。但是,根据游戏的范围和资产,您不应该真的需要像这样动态加载。

最后,关于倾销资产:答案是OO编程的伟大转变:抽象。如果您在组织成员时遇到困难,那么根据需要将它们移动到继承的类或子类中(并且只有在合理的情况下)。在我的游戏设计中,每个类的Texture2D,1 SoundBankVertexBuffer / IndexBuffer很少超过2 Player.base。如果我设计得很好,它们会存储在像“Sprite”这样的基类中,任何可视对象都会从中继承。在我最新的工具集中,我已经深入了一层,所以现在看起来像“.Animation.Texture(这是精灵)Animation”如果你想要访问实际的纹理......但是你不需要,因为所有动画/绘图都由Position类完全处理,并由Sprite和RotationScaleBoundingTexture2D PlayerTex更新等等。

因此,将游戏分解为对象。如果您在Vector2 PlayerPos课程中存储了GameDraw,并且在PlayerTex PlayerPos正在PlayerTex PlayerPos,那么您就不会OO编程的优势。将PlayerGame存储在Player myPlayer类中,该类还定义了播放器的所有其他方面和行为(方法)。现在Draw所需要的只是myPlayer.Draw(SpriteBatch .. etc),而Entity中你需要Level。你可以更进一步!以下是几乎所有游戏都会有的类:Entities(所有动态对象的基类),GameScreen(存储每个级别的风景和Level并处理它们的交互),{{ 1}}(在完成每个成员时存储并递增其ScreenManager成员),Screen(存储要更新的GameScreen个堆栈,如MenuScreen,还要PauseScreen 1}},LoadingScreenGame1)...列表继续。此时,您的所有ScreenManager课程都会更新ScreenManager,如果您从IDrawableGameComponent继承#region <name>,则您甚至不必这样做。

我希望我没有潜入OO 101的深层,但如果你无法跟踪主要班级的所有成员,你应该开始打破局面。这是一项基本的OO技能。

如果其他所有方法都失败了,请学习大量使用#endregion / {{1}}标签。老实说,无论如何都要使用它们,它们会让一切变得更好。