§4.1Game类

你已经在前几章使用了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类使用几个单元测试来确保游戏的每一个部分如你计划的工作。


发布时间:2008/6/26 上午8:00:07  阅读次数:5941

2006 - 2024,推荐分辨率 1024*768 以上,推荐浏览器 Chrome、Edge 等现代浏览器,截止 2021 年 12 月 5 日的访问次数:1872 万 9823 站长邮箱

沪 ICP 备 18037240 号-1

沪公网安备 31011002002865 号