zoukankan      html  css  js  c++  java
  • 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文件夹,你会发现该示例框架文件位于SamplesManagedCommon文件夹中,选择每个文件并添加到你的项目中。

        在示例框架组件被添加到项目中以后,你就可以去掉自动生成的代码了。这些代码中的大部分都是用于建立别致的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.Dire
    ctX.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)。在A8R8G8B8中,该格式可以包含32位色彩信息,alpha、red、green和blue各用8位。最常见的构成是:

        A Alpha
        R Red
        G Green
        B Blue
        X Unused

      你可以查看DirectX SDK文档得到更多关于格式的信息。由于我们还需要知道该设备时候可以显示在窗体中,所以这个方法还有一个参数(最后一个)。尽管大多数游戏都运行在全屏模式下,但是编写和调试在全屏模式下运行的游戏却很困难。在调试过程中,这个应用程序在窗体模式而不是全屏模式下显示。

      请注意,窗体模式是我们运行的大多数应用程序的显示方式。其中大多数应用程序带有边框和控制菜单,右上角带有最小化、最大化和关闭按钮。在全屏模式下,应用程序覆盖了整个屏幕,并且在大多数情况下没有边框。如果全屏模式使用了另外的屏幕大小(你当前使用的桌面),你可以改变桌面的分辨率。

  • 相关阅读:
    SQL Azure (17) SQL Azure V12
    Microsoft Azure News(5) Azure新DV2系列虚拟机上线
    Azure Redis Cache (3) 在Windows 环境下使用Redis Benchmark
    Azure PowerShell (11) 使用自定义虚拟机镜像模板,创建Azure虚拟机并绑定公网IP(VIP)和内网IP(DIP)
    Windows Azure Virtual Machine (31) 迁移Azure虚拟机
    Windows Azure Web Site (16) Azure Web Site HTTPS
    Azure China (12) 域名备案问题
    一分钟快速入门openstack
    管理员必备的Linux系统监控工具
    Keepalived+Nginx实现高可用和双主节点负载均衡
  • 原文地址:https://www.cnblogs.com/rainbow70626/p/5506371.html
Copyright © 2011-2022 走看看