Introduction to 3D Game Programming with DirectX 11 学习笔记 (2)D3DApp 类

D3DApp 是一个框架类,用于创建主窗口,创建 Direct3D 对象,并处理主循环逻辑。

源文件

${CODE}/d3dApp.h
${CODE}/d3dApp.cpp

类方法详解

HINSTANCE D3DApp::AppInst()

返回当前应用的实例句柄。该值在 D3DApp 的构造函数中传入并保存。一般在创建唯一的 D3DApp 实例时,将 WinMain 函数的 hInstance 传入。

HWND D3DApp::MainWnd()

返回主窗口的句柄。主窗口在 D3DApp::InitMainWindow 方法中创建。

float AspectRatio()

返回窗口客户区的宽、高比。一般用于计算投影矩阵。

bool D3DApp::InitMainWindow()

定义窗口类、注册窗口类,创建并显示主窗口。

bool D3DApp::InitDirect3D()

创建 Direct3DDeviceSwapChain 并调用 OnResize() 创建深度缓存(Depth Stencil Buffer),设置渲染目标(Render Target),并设置视口(Viewport)。

void D3DApp::CalculateFrameStats()

计算并在主窗口标题栏上显示 FPS 和每帧时间。

bool Init()

初始化框架。调用 InitMainWindowInitDirect3D 方法。

LRESULT D3DApp::MsgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

窗口消息处理函数。该函数为虚函数,可以在子类中覆盖。子类应当在覆盖后,在处理完自己所需消息后,再次调用 D3DApp::MsgProc 函数,让基类继续处理其他消息。

void UpdateScene(float dt)

纯虚函数,必须在子类中定义。参数为两帧之间的时间间隔,用于计算场景的变化。

void DrawScene()

纯虚函数,必须在子类中定义。调用 Direct3D API ,绘制场景。

void Run()

处理消息循环。在没有消息的时候,处理计时器,调用 UpdateScene 方法,及 DrawScene 方法。如果计时器暂停,休眠 0.1 秒。默认情况下,当主窗口失去焦点时,计时器暂停。

D3DApp()

初始化主窗口标题,窗口客户区大小,及 Direct3D 驱动类型等参数。

~D3DApp()

释放资源,主要是 Direct3D 相关的资源和对象。

要点

窗口的消息处理函数,不能是类的成员函数。因为类的成员函数隐含一个 this 指针,与窗口消息处理函数的原型不匹配。为了解决这个问题,添加了一个全局函数 MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam),用于主窗口的消息处理函数。该函数通过唯一的 D3DApp* gd3dApp 全局指针,将消息处理函数的参数转发给唯一的框架类,实现了通过类的成员函数,实现窗口消息处理函数的功能。

你可能感兴趣的:(directx,graphics,d3d11dragonbook)