现在的位置: 首页 > 综合 > 正文

DirectX 9 UI设计学习笔记之三:第4章Introducing DirectInput+第5章Wrapping Direct3D

2018年04月09日 ⁄ 综合 ⁄ 共 3915字 ⁄ 字号 评论关闭
文章目录

       此文由哈利_蜘蛛侠原创,转载请注明出处!有问题欢迎联系本人!

       邮箱:2024958085@qq.com

 

       上一期的地址:

DX 9 UI设计学习笔记之二

 

4章 Introducing DirectInput

======================================================================

       在这一章中我们要学到如下东西:

1Create COM interfaces that represent and control input peripherals attached to the user’s computer.(创建代表以及控制连接到用户的电脑的输入附件的COM
接口。)

2Set how input devices operate and are shared from program to program.(对输入设备如何运作已经在程序间进行分享进行设置。)

3Read information from keyboards and mice whenever events occur. This will consist of determining which keyboard keys or mouse buttons are pressed,
and reading the position of the mouse cursor.
(在事件发生的时候,从键盘和鼠标读入信息。这包括确定键盘或者鼠标的哪个键或按钮被按下了,以及读入鼠标指针的位置。)

4Set the mouse cursor to an image loaded from a file.(将鼠标的指针设为一个从文件载入的图片。)

 

4.1节 DirectInput Basics

       这一节非常简略地介绍了Direct Input。

 

4.2节 Getting Started

       这一节基本上什么也没有讲。要注意的是,如果打算使用Direct Input,那么要包含头文件 dinput.h,并将库文件 dinput8.lib 连接到工程中。

 

第4.3节 Programming

       如何创建一个能够使用 Direct Input 的应用程序?我们要遵循以下步骤:

1Create a DirectInput object。建立一个 DirectInput
对象。

2Create a DirectInput device objects(s)。建立一个或多个 DirectInput device
对象。

3Configure the DirectInput device objects(s)。设置这些DirectInput device
对象的属性。

4Acquire the device。获得该设备。

5Read data from the device。从设备读取数据。

6Release the DirectInput and DirectInput device object(s)。释放DirectInput
DirectInput device
对象。

 

第4.4节 Creating aDirectInput Object

       在最开始,我们需要调用DirectInput8Create 函数来创建指向一个IDirectInput8 实例的指针。

       最后不要忘了释放IDirectInput8 对象。

 

第4.5节 CreatingDirectInput Devices

       在创建了一个IDirectInput8 对象之后,我们需要调用它的CreateDevice 方法来创建一个DirectInput device,也就是一个IDirectInputDevice8 接口。

       同样,最后不要忘了释放这个接口。

 

第4.6节 TheKeyboard

第4.7节 The Mouse

       这两节分别详细介绍了如何让你的DirectInput 程序支持键盘和鼠标的输入。一般的DirectX 9 教材都会讲到;不过与一般的这些教材不一样的是,这里还讲了如何对鼠标的指针图案进行设置的话题。不过这个话题现在只是开了个头,如果读者你打算自己去实验的话,会发现很多问题的;所以我们以后再去慢慢研究吧!

======================================================================

 

第5章 Wrapping Direct3D

======================================================================

       这一章我们要定义三个类:CXSurface、CXTexture 以及CXPen。

 

       这一章充满了各种错误。严重怀疑作者的这些代码没有经过运行就放了上来!幸亏在本人的机智下,这些错误都已经改正了过来,嘿嘿!

第5.1节CXSurface----Wrapping Surfaces

       这一节详细介绍了CXSurface类的定义及其实现。先在一开始给出了定义,然后在第5.1.1节Instantiating and Deleting CXSurface、第5.1.2 节Loading Images、第5.1.3 节Copying Surfaces、第5.1.4 节Representing the Back Buffer、第5.1.5 节Rendering 以及第5.1.6 节Using CXSurface 这些小节中介绍了各个方法的实现以及如何使用这个类。

       当然,如前所述,这里面有各种错误。比如说在类的定义中,所有的Set 函数都有一个const 后缀,但是这显然是不对的(这种错误延续到了这一章的最后一个类)。另外,作者在CXSurface 类中定义了三个受保护的成员:

protected:
    LPDIRECT3DSURFACE9m_Surface;
    CXSurface*    m_BackBuffer;
    LPDIRECT3DDEVICE9m_pDevice;

然后构造函数是这样定义的:

CXSurface::CXSurface(LPDIRECT3DDEVICE9pDevice)
{
    this->SetDevice(pDevice);
    this->SetSurface(NULL);
    m_BackBuffer = new CXSurface(pDevice);
}

       不过如果你依样画葫芦的话,会发现导致错误。仔细想想就能够发现问题所在:这特么是无限递归啊,我去!看来作者想在一个类对象中同时处理surface 和backbuffer 的美好愿望落空了。于是在我的代码中,我定义了两个CXSurface 对象来分别代表要渲染的surface 和backbuffer,效果还真不错!

       另外一个问题是:类定义中没有Render 方法,为何后面突然冒出来了一个?没关系,反正在我们的代码中不会用到这个方法的……

   

第5.2节 CXTexture----Wrapping Textures

       这一节准备将texture 封装到一个类中。这里面仍然有很多错误。除了前面提到的所有的set 函数都以const 为后缀以外,还有就是在构造函数中没有初始化m_SrcRect,并且一个2维向量竟然出现了z 分量。另外值得注意的是,在后面要提到的CXPen 类的DrawTexture 方法中,使用ID3DXSprite 类的Draw 方法时,要以CXTexture 对象的m_SrcRect 的指针为参数,但是要注意我们可以将这个指针设为0 以绘制整个texture,而这个是书上没有考虑到的。

 

第5.3节 CXPen----Wrapping ID3DXSprite

       这一节比较简单,基本上没什么说的。当然错误还是有的。

   

======================================================================

   

       下面奉上本人的代码!地址如下:

DX 9 UI设计第5章代码修正版

 

       下面是程序运行时的截图:

 

       这里有三幅图。被遮挡的那幅图是复制到后台缓存上的一个surface,而左右的那两幅都是textures。上一次的程序有一些bug,就是这么几个:一个是全屏的时候按Alt+Enter 切换出去时会出错,另外一个是最大化的时候切换到全屏的时候会出错。本人花了很长的时间搞定了第一个问题。然后在努力解决第二个问题的时候,又发现从全屏切换回窗口模式的时候窗口会变小,再全屏再切换回来,窗口又会变小,这样反复多次之后,窗口就小得可怜了。不过在本人的努力之下,这些问题都解决了!现在不管你怎么样玩弄程序的窗口,都不会有问题啦,哈哈!还有很给力的特性,就是从全屏切换回窗口的时候,窗口的大小和之前是一样的。如果有问题的话,那么只能是你的电脑出问题了。

       哦,不对,在显示surface的情况下,窗口的边界不能够跑到那个surface 的里面,否则会因为后台缓存装不下这个surface 而报错!不过没关系,你可以把绘制surface 的那个语句注释掉,然后你就可以随意玩弄窗口了!

       另外大家应该已经发现了,代码多了一个GfxStats类,而窗口左上角也有了统计数据。这个是本人从“龙书”第二版的代码中拿来的封装了字体的类,可以在屏幕上显示文本,方便你对程序进行调试;当然大家可以无视掉,虽然这个COM 组件用起来很简单。

       当然,程序到了这一步还有一点小瑕疵,就是在最大化的时候切换到全屏再切换回来的时候,窗口只是尺寸最大化了,但并不是通常意义上的“最大化窗口”;还有就是退出全屏时的窗口的位置也不是跟原来一样的。不过这些都是小问题啦,咱么以后有时间再弄吧,哈哈!

抱歉!评论已关闭.