【DirectX】5-代码框架2-CInput与CGraphics

教程地址

Tutorial 2: Creating a Framework and Window

学习记录

  上一篇文章中,我们构建了一个用于窗口创建的类 CSystem ,并成功使用它启动了窗口。可以看到,在我们封装之后,它的使用及其的方便。而这篇文章中,我们将对其进行扩展,在我们创建窗口后,我们将在主循环中写入程序逻辑。包括我们的鼠标键盘输入以及对应的程序输出,因此,我们将实现 CInputCGraphics 类(之所以不以 COutput 是因为我们的程序不仅仅包含图形一种输出,但我们现在只实现这一种)。在完成今天的两个类后,我们的框架结果将会变为下图的样式 。

dx framework 1

  我们的 CInput 类将包含鼠标键盘的处理,鼠标与键盘将成为子类来设计,所以这里的 CInput 类简直简单的可怕。

1
2
3
4
5
6
7
8
9
10
11
class CInput {
public:
CInput();
CInput(CInput& input);
~CInput();
bool Initialize();
void Shutdown();
private:
bool InitializeInput();
void ShutdownInput();
};

  这将是我们的 CInput 类声明,它仅仅包含了 Initialize() , 以及Shutdown()函数,以及构造和析构函数。我们将在之后为这个类添加键盘处理 CKeyboard 和鼠标处理 CMouse 类(下一篇文章再谈)。

  CInput 类的构造方法中我们调用 Initialize() ,而在 Initialize() 中调用 InitializeInput() ,在 Shutdown() 方法里调用 ShutdownInput() 方法。

  现在我们已经有了 CInput 类,则准备在 CSystem 里添加对应的元素 。在 CSystem 的声明里为它添加一个 CInput 的指针对象:

1
CInput *mInput_;

  在 CSystemInitialize() 里我们将初始化 CInput 指针对象,最后在析构函数里释放掉它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool CSystem::Initialize() {
...
this->mInput_ = new CInput;
if (!mInput_) {
return false;
}
...
return true;
}

void CSystem::Shutdown() {
delete mInput_;
delete mGraphics_;
}

   现在,再来看看我们的 CGraphics 类:

1
2
3
4
5
6
7
8
9
10
11
12
13
class CGraphics {
public:
CGraphics();
CGraphics(CGraphics& cGraphics);
~CGraphics();
bool Initialize();
void Shutdown();
bool Render();
private:
bool InitializeGraphics();
void ShutdownGraphics();
bool RenderGraphics();
};

  我们的 CGraphics 类中的 Initialize()Shutdown()CInput 中的一样,暂且不表。Render() 暂时也是简单的调用了 RenderGraphics() 。而 RenderGraphics() 则是负责了主要的东西,因为我们并没有后续内容,所以在此也暂时不提。

  综上所述,我们的 CGraphics 类也是相当简单,现在和 CInput 一样将他加入到 CSystem 的初始化与结束中去:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
bool CSystem::Initialize() {
int screenWidth = 1920;
int screenHeight = 1080;
InitializeWindows(screenWidth, screenHeight);
this->mInput_ = new CInput;
if (!mInput_) {
return false;
}
this->mGraphics_ = new CGraphics;
if (!mGraphics_) {
return false;
}
return true;
}

void CSystem::Shutdown() {
if (mInput_) {
mInput_->Shutdown();
delete mInput_;
mInput_ = 0;
}
if (mGraphics_) {
delete mGraphics_;
mGraphics_ = 0;
}
ShutdownWindows();
}

  以上是我们增加了 CInputCGraphics 类后的初始化。但是虽然进行了初始化,但是在代码中却并没有真的调用它,接下来看看在 CSystem 中的调用。

  CInput 我们因为没有具体实现的原因,没什么可以动用的。而 CGraphics 则需要在 Run 方法里进行修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void CSystem::Run() const {
MSG msg;
ZeroMemory(&msg, sizeof(MSG));
while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if (mGraphics_) {
mGraphics_->Render();
}
}
}

  我们在 CSystem::Run() 里调用了 CGraphics::Render() 方法。

  现在,你点击运行,如果没有错误的话,那么那个黑色窗口应该还会出现。

DX Framework2

  下一篇我们将会实现 CInput 下的类 CKeyboardCMouse

0%