0

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

话虽如此,这是我的问题

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

  2. 除了更快的加载还有什么优势。

  3. 我应该在 LoadContent() 子之外调用 Content.Load(Of T)([some assets name]) 吗?

您如何处理不同屏幕的加载资源?您是否在顶部声明所有资产?

先谢谢了,

埃里克

4

1 回答 1

1

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

这是一种很好的做法,但最终取决于您选择加载内容的位置。请记住,内容加载需要从磁盘读取,这不是您想要确定的每一帧都做的事情,也不是我们在游戏期间真正喜欢做的事情。您需要设置游戏状态管理,以便在加载屏幕或游戏启动期间而不是在游戏本身期间完全加载内容。当然,这正是关卡加载屏幕的用途!如果您非常聪明,您可以在游戏暂停期间偷偷加载,这是银河战士 Prime 的“门加载”。但是,根据游戏的范围和资产,您实际上并不需要像那样动态加载。

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

所以,把你的游戏分解成对象。如果你在你的类中存储 a并且在你Texture2D PlayerTex的绘图中,你没有利用 OO 编程。存储在一个类中,该类还定义了播放器的所有其他方面和行为(方法)。现在您只需要 in ,并且在您调用. 你可以更进一步!这里有一些几乎每个游戏都会有的类:(所有动态对象的基类),(存储风景和每个关卡并处理它们的交互), (存储并在每个完成时增加其成员), (存储一堆Vector2 PlayerPosGameDrawPlayerTexPlayerPosPlayerTexPlayerPosPlayerGamePlayer myPlayerDrawmyPlayer.Draw(SpriteBatch .. etc)EntityLevelEntitiesGameScreenLevelScreenManagerScreens 来更新,比如GameScreen, MenuScreen, PauseScreen) LoadingScreen... 这个列表还在继续。在这一点上,你的Game1类所做的就是更新ScreenManager,如果你继承ScreenManagerIDrawableGameComponent,你甚至不必这样做。

我希望我没有深入到 OO 101 的深处,但是如果您在跟踪主类的所有成员时遇到困难,您应该开始分解。这是一项基本的 OO 技能。

如果一切都失败了,请学会自由地使用#region <name>/#endregion标签。老实说,无论如何都要使用它们,它们会让一切变得更好。

于 2012-05-09T21:16:39.407 回答