当前位置:编程学习 > C#/ASP.NET >>

Visual C#编写3D游戏框架示例

答案:     你可能对实际地编写游戏代码期待已久了。由于DirectX SDK 2004年夏季更新包含了一个牢固的示例框架组件,并且它被设计成能在你自己的代码中直接使用,同时还为你处理了很多事务,所以你只要简单的使用它,就可以节省大量的时间和精力。
  
  本文中的例子使用的就是这个示例框架组件,在本文中,你将学习到的内容有:
  
  · 如何建立自己的项目
  
  · 如何使用示例框架组件来列举设备
  
  建立项目
  
  在本文中,我假定你的所有开发工作都将使用Visual Studio .NET 2003来完成。如果你不希望使用这个环境,可以使用命令行编译代码,它允许你使用任意的文本编辑器或集成开发环境(IDE)。
  
  启动Visual Studio .NET 2003并点击起始页面中的"新建项目"按钮。如果你没有使用起始页面,可以点击"文件"菜单下的"新建"子菜单中的"项目"菜单项,或者使用Ctrl+Shift+N。选择"Visual C#项目"区域中的"Windows项目"数据项。把这个项目命名为Blockers,这是游戏的名称。
  
  在你查看自动生成的代码之前,首先把示例框架组件添加到你的项目中。一般情况下,我会在"解决方案浏览器"中建立一个新文件夹,并把这些文件放入一个这个独立的文件夹中(把这个文件夹的名字取为Framework)。右键点击这个新建的文件夹,从"添加"菜单中选择"添加已有的项"。导航到DirectX SDK文件夹,你会发现该示例框架文件位于Samples\Managed\Common文件夹中,选择每个文件并添加到你的项目中。
  
  在示例框架组件被添加到项目中以后,你就可以去掉自动生成的代码了。这些代码中的大部分都是用于建立别致的Windows窗体应用程序的,因此,它与我们编写游戏的代码是无关的。用列表1中的代码替换已有的代码和类(Form1)。
  
  列表1:空的框架组件
  
  using System;
  
  using System.Configuration;
  
  using Microsoft.DirectX;
  
  using Microsoft.DirectX.Direct3D;
  
  using Microsoft.Samples.DirectX.UtilityToolkit;
  
  public class GameEngine : IDeviceCreation
  
  {
  
  ///程序入口。初始化所有部分并进入一个消息处理循环。用空闲时间显示场景
  
  static int Main()
  
  {
  
  using(Framework sampleFramework = new Framework())
  
  {
  
  return sampleFramework.ExitCode;
  
  }
  
  }
  
  }
  
  这段新代码中有三个地方比较突出。首先,你可能注意到了除了静态的main方法之外,删除了所有东西,而且main方法也被修改过。剩余的代码是Windows窗体设计器的支撑代码。由于这个应用程序不需要使用该设计器,因此这些代码就没有用了,可以被删除。其次,这段代码不能编译,因为游戏引擎希望实现的两个接口还未实现。再次,这段代码实际上没有做任何事务。
  
  在你开始解决后面两个问题之前,你必须添加一些引用。由于你准备在这个项目中显示奇特的3D图像,你就必须给项目添加能执行这样的显示操作的组件的引用。本文采用受控DirectX来执行这种操作,因此你需要在"项目"菜单中选择"添加引用"。图1显示了弹出的对话框。
  
  
  图1:添加引用对话框
  
  如果你安装了DirectX 9 SDK 2004年夏季更新,你会发现有多个版本的受控DirectX组件可供使用。请选择最新的版本(1.0.2902.0版本)。对于这个项目来说,你需要添加三个不同的组件引用:
  
  · Microsoft.DirectX
  
  · Microsoft.DirectX.Direct3D
  
  · Microsoft.DirectX.Direct3DX
  
  DirectX根(root)组件包含了辅助显示计算的数学结构。其它两个组件相应地包含了Direct3D和D3DX的功能。添加这些引用之后,你可以简单地查看一下列表1中添加的using语句,以确保名字空间被正确地引用了。这个步骤可以确保你不需要完整地限定类型。例如,如果不添加using语句,那么声明一个Direct3D设备变量,就必须使用下面的语句:
  
  Microsoft.DirectX.Direct3D.Device device = null;
  
  Using语句可以减少很多输入内容(没有人希望在声明一个变量时输入全部的内容)。由于你已经增加了using语句,就可以使用如下所示的声明语句了:
  
  private Device device = null;
  
  你可以看到,用这种方式声明变量简单多了,节省了大量的输入。在了解这些信息之后,你可以开始修补应用程序编译过程中的错误了,并准备好编写第一个3D游戏了。你现在必须实现的唯一一个接口是IDeviceCreation,它控制着设备的列举和建立。
  
  你可能会想"列举设备做什么?我只有一个监视器"!尽管一般情况下是这样的,但是现在的显卡实际上是支持多个监视器的,即使你只有一个设备,你仍然拥有多个可选择的模式。显示器的格式可能不同(你可以在Windows桌面设置中看到这些种类,例如16位色和32位色)。全屏幕模式下的高度和宽度也可能有不同的值,你甚至于还可以控制屏幕的刷新率。总而言之,还是有些事情需要解决。
  
  列表2中的代码修补的应用程序中的编译错误。
  
  列表2:实现接口
  
  /// 设备初始化的时候调用。这段代码检查设备最小的性能,
  
  /// 如果没有通过检查,就返回false
  
  public bool IsDeviceAcceptable(Caps caps, Format adapterFormat,
  
  Format backBufferFormat, bool windowed)
  
  {
  
  if (!Manager.CheckDeviceFormat(caps.AdapterOrdinal, caps.DeviceType,
  
  adapterFormat, Usage.QueryPostPixelShaderBlending,
  
  ResourceType.Textures, backBufferFormat))
  
  return false;
  
  if (caps.MaxActiveLights == 0)
  
  return false;
  
  return true;
  
  }
  
  /// 在建立某个设备之前,这个回调函数会被立即调用,以允许应用程序修改设备的
  
  /// 设置信息。它提供的设置参数包含了框架组件为新设备挑选的设置, 并且应用程序
  
  /// 可以直接对这个结构进行任何需要的修改。请注意,示例框架没有纠正无效的
  
  /// 设备设置信息,因此必须小心地返回有效的设备设置,否则建立设备就会失败。
  
  public void ModifyDeviceSettings(DeviceSettings settings, Caps caps)
  
  {
  
  // 这个应用程序没有使用任何get方法,它被设计成在一个纯设备上工作。
  
  // 因此如果受到支持并且使用HWVP,就建立一个纯设备。
  
  if ( (caps.DeviceCaps.SupportsPureDevice) && ((settings.BehaviorFlags & CreateFlags.HardwareVertexProcessing) != 0 ) )
  
  settings.BehaviorFlags |= CreateFlags.PureDevice;
  
  }
  
  请你查看一下声明的IsDeviceAcceptable方法。在示例框架忙着枚举系统中的设备的时候,它会在每个找到的组合上调用该方法。注意到该方法返回一个布尔型值吗?这使得你有权利告诉示例框架你认为某个设备是否符合需求。但是,在你仔细查看第一个方法中的代码的时候,请先看一下声明的第二个方法(ModifyDeviceSettings)。某个设备被建立之前,示例框架会立即调用这个方法,允许你加入任何希望的选项。但是你要小心地使用参数选项,因为它可能导致设备建立失败。
  
  现在我们回到第一个方法:我们先看一下它的参数。首先,它带有一个Caps类型的参数,它是设备性能的简单结构体。该结构体包含了具体设备的巨量信息,可以帮助你决定某个类型是不是你正在使用的设备类型。其后的两个参数都是特定设备的格式参数:一个是后台的缓冲区格式,另一个是设备的格式。
  
  请注意
  
  后台缓冲区是实际要显示的数据(象素)在发送给显卡处理并输出到屏幕之前所存储的地方。后台缓冲区的格式决定了可以显示多少种色彩。大多数格式遵循特定的命名习惯--每个字符跟着一个数字,例如A8R8G8B8。字符所指定的构成部分拥有与其后面的数字相同数量的位(bit)。在

上一个:Visual C#编写3D游戏框架示例(2)
下一个:C-Omega 概述

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,