首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xna /内容管道/资产和屏幕管理

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

Stack Overflow用户
提问于 2012-05-08 22:22:03
回答 1查看 292关注 0票数 0

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

话虽如此,以下是我的问题

  1. 应该使用Texture2D.FromFile()上的内容管道。除了更快的loading.
  2. Should之外,
  3. 还有什么其他优点,我称之为Content.Load(Of T)(一些资产名称)在LoadContent()子之外。

如何处理不同屏幕的加载资产?你宣布所有资产都在最上面吗?

感谢你的进步,

埃里克

EN

回答 1

Stack Overflow用户

发布于 2012-05-09 21:16:39

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

这是一个很好的实践,但最终决定您选择在哪里加载内容。请记住,内容加载需要从磁盘读取,这不是您想要做的每一帧确定,而不是真正的事情,我们喜欢做的游戏。您将希望设置您的游戏状态管理,以便内容可以完全加载在加载屏幕或游戏启动,而不是在游戏本身。当然,这正是水平加载屏幕的用途!如果你很聪明的话,你可以在游戏暂停期间偷偷地装载,这是一款“都市之城”的“门装”。不过,取决于游戏的范围和资产,您不应该真的需要像这样动态加载。

最后,关于抛出资产:答案是OO编程的大特例:抽象。如果组织成员有困难,那么根据需要将它们移到继承的类或子类中(并且只在合理的情况下)。在我的游戏设计中,我很少有超过两个Texture2D,一个SoundBank,也许每个类有一个VertexBuffer/IndexBuffer。如果我设计得很好,这些东西都存储在像"Sprite“这样的基类中,任何视觉对象都可以从它继承。在我最新的一套工具中,我已经做了一个更深的层次,所以如果您想访问实际的纹理,那么现在它看起来就像“Player.base(即雪碧).Animation.Texture”.但是您不需要这样做,因为所有的动画/绘图都是完全由Animation类处理的,由Sprite与PositionRotationScaleBounding等一起更新。

所以,把你的游戏分解成物体。如果要将Texture2D PlayerTexVector2 PlayerPos存储在Game类中,在Draw中要在PlayerPos中绘制PlayerTex,则没有利用OO编程。将PlayerTexPlayerPos存储在Player类中,该类还定义播放器的所有其他方面和行为(方法)。现在,在Game中,您所需要的是Player myPlayer,在Draw中,您只需要调用myPlayer.Draw(SpriteBatch .. etc)。你可以走得更远!以下是几乎每个游戏都会拥有的一些类:Entity (所有动态对象的基类)、Level (存储每个级别的景物和Entities并处理它们的交互)、GameScreen (在每个游戏完成后存储和增加其Level成员)、ScreenManager (存储一堆Screens来更新,比如GameScreen,但也包括MenuScreenPauseScreenLoadingScreen).清单不胜枚举。此时,Game1类所做的就是更新ScreenManager,如果从IDrawableGameComponent继承ScreenManager,甚至不必这样做。

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

如果所有这些都失败了,那么学习如何自由地使用#region <name>/#endregion标记。老实说,不管怎么说,他们都能让一切变得更好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10507417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档