该游戏的大多数地方需要当前级别的信息。当前时间非常重要,因为它用于确定玩家的分数和游戏结束时间(如超时,游戏即结束),因此当前级别必须访问它。
实际的级别存储在文件系统中,位于应用程序的媒体目录中。因为当前级别需要加载一个已经存在的级别,所以它也需要访问这些信息。级别需要记录的信息是组成级别的立方体列表。每一个级别需要至少两个立方体,但是可以添加更多的立方体以满足更高的级别。
该游戏并不容易编写,但是它并不需要创建多个对象确保满足游戏的目标。该游戏也非常好玩,只要更难的级别不会难到让玩家无法完成。一个游戏决不能够让玩家感到苦恼。如果游戏不好玩,则没有人会玩,该游戏也不可能成功。
认识到这个游戏(实际上任何游戏都是这样)不需要创造为完全3d的世界,是非常重要的。考虑到您的显示器很可能是一个矩形的平板,最终3d图形将显示在一个2d平面上。创建一个2d组图(sprite)的集合,该集合将覆盖每一种可能的场景,但是这种情况下所需要的艺术资产是巨大的。查看下面的例子。
假设已经安装了directx sdk summer 2004 update,请加载directx sample browser(图2-1),确保managed选项是左边被选中的惟一项。单击direct3d标题,向下寻找empty project项,并单击install project链接,遵循向导的步骤创建项目(将该项目命名为“teapot”)。项目创建后,将其加载到ide中。
图2-1 directx sample browser
这将创建一个新的“空”项目(它实际上生成了某些用户界面控件,但是现在,那些都被忽略)。但是,该项目中还不存在任何3d,由于这个练习的目的是演示为什么希望编写3d游戏,所以最好添加一些内容。
在这个项目中添加少量的代码,生成一个慢速旋转的茶壶。您要添加几行代码,使得该应用程序能够进行图形绘制,在本章中不对这些代码功能进行解释。在本书的后面将给出大量的篇幅解释这些代码,但对于目前的演示来说,它们不是必需的。假设您将项目命名为“teapot”,打开代码文件teapot.cs并将下面两个变量添加到这个类文件中:
private mesh teapotmesh = null; // mesh for rendering the teapot
private material teapotmaterial; // material for rendering the teapot
现在创建茶壶和用于绘制场景的材质,找到该类中的oncreatedevice方法,将下面的代码添加到该方法的结尾处:

