图形引擎(三):添加应用程序中的各种组件

来源:互联网 发布:ubuntu划分区备份 编辑:程序博客网 时间:2024/06/05 19:26

图形引擎(三):添加应用程序中的各种组件

在进一步学习Direct3D渲染之前,我们首先在应用程序中添加一些组件,用于完善图形引擎。
组件主要分为两种:一种是基本的GameComponent类用于完成一些控制操作,另一种是在些基础上扩展的DrawableGameComponent类,用于执行绘制操作。在这一步,我们主要添加三个组件,分别为FpsComponent,Keyboard,Mouse。其中Keyboard和Mouse属于基础控制类的组件,主要用于支持鼠标和键盘输入设备,而FpsComponent是一种用于绘制的组件,主要用于在屏幕上绘制  fps 数据的文本。此外,DirectXTK库中包含了用于绘制文本的SpriteBatch and SpriteFont接口。
关于组件和文本绘制的详细描述,请查看对应的博客详解。

输入设备

响应输入设备主要有两种方式:中断轮询和事件通知。对于不同的输入设备响应,需要使用不同的方式。在这里,我们主要使用DirectInput轮询的方式响应鼠标和键盘。
关于DirectInput的使用方法,请查看对应博客的详细讲解。
其中有以下几点需要注意:
1.启动程序时,需要获取鼠标当前的坐标值,并进行显示。
2.设置鼠标移动的范围,使坐标值始终控制下窗口大小内。
3.如果应用程序运行在全屏模式下,需要在创建窗口之前,获取屏幕的分辨率,并使用窗口的大小与屏幕大小相同。

以下代码用于在Mouse的Initialize()函数中获取鼠标的初始坐标:
// Get the current cursor postion, and set it to mX, mYPOINT pt;GetCursorPos(&pt);if (!mGame->IsFullScreen()){// For window mode, convert screen coordinates to client coordinatesScreenToClient(mGame->WindowHandle(), &pt);}mX = pt.x;mY = pt.y;

在Mouse的Update()函数中,控制鼠标的移动范围:
// Accumulate positionsmX += mCurrentState.lX;mY += mCurrentState.lY;mWheel += mCurrentState.lZ;Utility::Clamp(mX, 0, mGame->ScreenWidth());Utility::Clamp(mY, 0, mGame->ScreenHeight());if (!mGame->IsFullScreen()){POINT pt{ mX, mY };// For window mode, convert client coordinates to screen coordinates// Set cursor always in window client areaClientToScreen(mGame->WindowHandle(), &pt);SetCursorPos(pt.x, pt.y);}
其中Utility::Clamp函数用于把一个数据clamp到给定的两个范围值之间,函数实现代码如下:
void Utility::Clamp(long& value, long lower, long upper){if (value <= lower){value = lower;}else if (value >= upper){value = upper;}else{}}
接下来,对于全屏模式的应用程序,需要把窗口大小设置为屏幕的大小,在Game::Run函数中,调用InitializeWindow()函数之前添加以下代码:
if (mIsFullScreen){mScreenWidth = GetSystemMetrics(SM_CXSCREEN);mScreenHeight = GetSystemMetrics(SM_CYSCREEN);}
其中GetSystemMetrics函数用于获取一些系统信息,其中SM_CXSCREEN和SCM_CYSCREEN分别表示获取屏幕的宽和高。
由于mIsFullScrenn在Game类中的访问权限是producted,如果想使应用程序在启动时使用全屏模式,只需要在RenderingGame的构造函数中,设置mIsFullScrenn为true。如下所示:
RenderingGame::RenderingGame(HINSTANCE instance, const std::wstring& windowClass, const std::wstring& windowTitle, int showCommand): Game(instance, windowClass, windowTitle, showCommand),mFpsComponent(nullptr),mDirectInput(nullptr), mKeyboard(nullptr), mMouse(nullptr),mSpriteBatch(nullptr), mSpriteFont(nullptr), mMouseTextPosition(0.0f, 20.0f){mDepthStencilBufferEnabled = true;mMultiSamplingEnabled = true;mIsFullScreen = true;}

整合组件

为了使用各个组件模块之间保持低耦合,可以使用services设计模式。具体详解请查看对应的博客。

图形引擎第三步的完整工程代码:
http://download.csdn.net/detail/chenjinxian_3d/9581448
1 0
原创粉丝点击