《XNA高级编程:Xbox 360和Windows》4-2

4.2 Game


     前几章您已经使用过了 Game 类,但这些章主要讲的是从 Program 类和单元测试中调用 Run 方法来启动游戏,以及如何使用 Initialize Update Draw 等方法,并没有讨论基本的设计。当然,如果做的只是一些简单的游戏,掌握这些知识就够了。但随着游戏的规模逐渐变大以及需要更多的游戏特性,您或许就需要好好考虑游戏类的设计了。

     Game 类中提供了保存图形设备的 GraphicsDeviceManager 实例以及保存内容管理器的相应变量。然后,在 Program 类中创建您的游戏类实例,并调用其 Run 方法就可以运行游戏了。和以往使用托管 DirectX OpenGL 不同的是,现在您不必再去管理您自己的游戏窗口、创建游戏循环、处理 Windows 消息等等,这些工作 XNA 都已经帮您做好了。正因为如此,您可以将您的游戏放到没有窗口类以及 Windows 事件的 Xbox 360 平台上运行!

     您可以使用游戏类的 Window 属性来对游戏窗口进行相关操作,比如设置窗口标题、是否允许用户更改窗口大小、调用底层的 Windows 句柄进行互操作等等。所有这些方法在 Xbox 360 平台上是不起作用的,在 Xbox 360 上没有窗口,没有窗口标题,当然也无法改变窗口大小。正如在上一个游戏中,您使用了 Window.Title 属性来设置简单的文本以向用户显示当前级别以及分数。这样做是因为 XNA 不支持字体,要想在屏幕上显示文本,您得自己创建位图字体并逐一渲染所有的字母。在接下来的几个游戏以及本章的俄罗斯方块游戏中,您都将用到该特性,稍后将介绍为此而创建的 TextureFont 类。

     另外值得一提的是,您可以在游戏类的构造函数中使用下面的方法设置自己偏爱的分辨率,这个例子使用了 1024×768 的全屏模式:

graphics.PreferredBackBufferWidth  =   1024 ;
graphics.PreferredBackBufferHeight 
=   768 ;
graphics.IsFullScreen 
=   true ;

     当然,并不能保证游戏就会正确地在所设置的分辨率下运行。比如,如果在一个最高只支持 1024×768 分辨率的系统上设置了 1600×1200 的分辨率,那么游戏将使用可用的最大分辨率。

     您已经知道,游戏在渲染每一帧的时候都要调用 Update Draw 方法, but how do you incorporate new game components without overloading the game class itself ? 下面就来看一下 Tetris 游戏的类以及组件设计关系图(如图 4-1 所示)。

《XNA高级编程:Xbox 360和Windows》4-2_第1张图片

4-1
 

     可以看到,这里有三个游戏类,而不是像之前的游戏那样只有一个,这样做是为了使主游戏类更加简短。 BaseGame 类保存图形设备管理器和内容管理器,以及游戏当前使用的分辨率的宽度和高度值。 Update Draw 方法处理新的 Input Sound 以及 TextureFont 类,这样在主游戏类中就不用再更新它们。 TetrisGame 类用来从内容管道加载所有的图像,初始化所有的 sprites 和游戏组件,这些将在稍后介绍。

     最后, TestGame 类继承自 TetrisGame 类,以便访问所有的 textures sprites 以及游戏组件,它只用于调试模式下来进行单元测试。 TestGame 类的功能和前几章的很类似,不过在这里它被从游戏主类中分离出来,以一种更好的方式进行组织。 TetrisGame 类使用了几个单元测试,以确保游戏的每个部分都能按照预期正常运行。

你可能感兴趣的:(windows)