我是XNA的新手,这是一个哲学问题。在我所见过的大多数示例中,游戏资产被定义为私有类变量,加载在LoadContent方法中,然后使用Draw方法绘制。如果我有一个很大的游戏,有很多屏幕,可能会有相当多的声明在这个类别的顶端。
话虽如此,以下是我的问题
如何处理不同屏幕的加载资产?你宣布所有资产都在最上面吗?
感谢你的进步,
埃里克
发布于 2012-05-09 21:16:39
使用内容管道可以使用二进制文件编译纹理,这样可以节省空间、加载时间,并保护您的资产不受编辑/未经授权的使用(如果您关心的话)。另一方面,如果您想要一个资产是可编辑的(如纹理包),FromFile()是有效的。当然,该文件必须存在于预期的目录中,并且正常使用。
这是一个很好的实践,但最终决定您选择在哪里加载内容。请记住,内容加载需要从磁盘读取,这不是您想要做的每一帧确定,而不是真正的事情,我们喜欢做的游戏。您将希望设置您的游戏状态管理,以便内容可以完全加载在加载屏幕或游戏启动,而不是在游戏本身。当然,这正是水平加载屏幕的用途!如果你很聪明的话,你可以在游戏暂停期间偷偷地装载,这是一款“都市之城”的“门装”。不过,取决于游戏的范围和资产,您不应该真的需要像这样动态加载。
最后,关于抛出资产:答案是OO编程的大特例:抽象。如果组织成员有困难,那么根据需要将它们移到继承的类或子类中(并且只在合理的情况下)。在我的游戏设计中,我很少有超过两个Texture2D,一个SoundBank,也许每个类有一个VertexBuffer/IndexBuffer。如果我设计得很好,这些东西都存储在像"Sprite“这样的基类中,任何视觉对象都可以从它继承。在我最新的一套工具中,我已经做了一个更深的层次,所以如果您想访问实际的纹理,那么现在它看起来就像“Player.base(即雪碧).Animation.Texture”.但是您不需要这样做,因为所有的动画/绘图都是完全由Animation类处理的,由Sprite与Position、Rotation、Scale、Bounding等一起更新。
所以,把你的游戏分解成物体。如果要将Texture2D PlayerTex和Vector2 PlayerPos存储在Game类中,在Draw中要在PlayerPos中绘制PlayerTex,则没有利用OO编程。将PlayerTex和PlayerPos存储在Player类中,该类还定义播放器的所有其他方面和行为(方法)。现在,在Game中,您所需要的是Player myPlayer,在Draw中,您只需要调用myPlayer.Draw(SpriteBatch .. etc)。你可以走得更远!以下是几乎每个游戏都会拥有的一些类:Entity (所有动态对象的基类)、Level (存储每个级别的景物和Entities并处理它们的交互)、GameScreen (在每个游戏完成后存储和增加其Level成员)、ScreenManager (存储一堆Screens来更新,比如GameScreen,但也包括MenuScreen,PauseScreen、LoadingScreen).清单不胜枚举。此时,Game1类所做的就是更新ScreenManager,如果从IDrawableGameComponent继承ScreenManager,甚至不必这样做。
我希望我没有深入到OO 101的深度,但如果你在跟踪你的主要班级的所有成员时有困难,你应该开始分解。这是一项基本的OO技能。
如果所有这些都失败了,那么学习如何自由地使用#region <name>/#endregion标记。老实说,不管怎么说,他们都能让一切变得更好。
https://stackoverflow.com/questions/10507417
复制相似问题