Game类
你已经在前几章使用了Game类,不过除了通过调用来自于Program类的Run方法启动游戏和单元测试、使用Initialize、Update、Draw方法之外,那些章节没有谈论基础设计。好的,如果你只是创建一些简单的游戏,你确实不需要知道其他的一切,但是当游戏越来越大,有更多特性的时候,你可能想要考虑类的概观,以及游戏中类的设计。
Game 自身通常持有GraphicsDeviceManager实例中的graphics device和content 字段中的 content manager。你仅仅必须从Program 类创建一个你的游戏类实例,并且调用Run方法来让一切被启动。不同于Managed DirectX或者OpenGL伴随的旧岁月,你不是必需管理自己的窗口、创建自己的游戏循环、处理Window消息等等。XNA为你做了所有的,因为以这样一种方式处理,你的游戏甚至可能运行在没有窗体类或者Windows事件可用的Xbox 360平台。
通过游戏类的Window 属性访问游戏的窗口还是可能的。这常常用来设置窗体的标题,改变窗体尺寸(如果用户被允许),调用interop进行windows 底层处理等等。所有这些方法在Xbox 360平台什么也不做。没有窗体、没有窗体标题、当然也不能改变窗体尺寸。正如你在上一个游戏中看到的,你使用Window.Title 属性给标题栏设置一些简单的文本,为用户显示当前level和分数。你这么做的原因是在XNA中没有字体支持;要在屏幕上渲染文本,你不得不自己创建位图字型,然后渲染每一个字母。在下个游戏中,甚至对于俄罗斯方块游戏,你将需要这个特性,所以TextureFont类要花几分钟介绍。
另外值得一提的是,像下例中通过设置图像属性那样,在游戏类的构造器中设置最佳分辨率是可行的,该例中俄罗斯方块使用了全屏模式的1024*768分辨率。
graphics.PreferredBackBufferWidth = 1024; graphics.PreferredBackBufferHeight = 768; graphics.IsFullScreen = true;
不保证游戏将来实际运行在这个模式;例如,在一个只支持1024*768的系统设置了1600*1200,将只使用最大可支持分辨率。
你已经知道了Update和Draw方法被每一帧调用,不过没有游戏类自身的重载,如何合并这些新的游戏组件呢?是看一看俄罗斯方块克隆游戏的game类和组件概观的时候了(见图4-1)。
图 4-1
你要注意的第一件事就是现在你有3个game类,而不像在上一个游戏范例中仅仅只有一个。那样做的原因是使得主游戏类简洁。BaseGame 类持有带有 graphics device的graphics manager、content manager,并且它保存了你在游戏中使用的当前分辨率的宽度、高度值。Update和Draw 方法也处理了新的Input、Sound和TextureFont类以避免在主游戏类中更新它们。然后TetrisGame 类用来加载所有来自于内容管道的图像,并且初始化所有精灵和游戏组件,稍后我们会学习到。
最后,TestGame类继承于TetrisGame类以便于访问所有的纹理、sprite、游戏组件,并且只使用debug模式启动单元测试。TestGame类的功能和上几章的非常相似,不过这一次它被以一种好的方式组织,并且从你的主游戏类中分离出了。TetrisGame类使用几个单元测试来确保游戏的每一个部分如你计划的工作。
转载于:https://www.cnblogs.com/AlexCheng/archive/2010/07/29/2120258.html