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 全局指针,将消息处理函数的参数转发给唯一的框架类,实现了通过类的成员函数,实现窗口消息处理函数的功能。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值