基于Dx11写一个自己的游戏引擎--4
编写图形模块
在项目目录下新建 Platform 文件夹用于编写不同平台的代码(虽然我只打算写windows下的,不过将来万一呢...)
在Platform下创建 Windows 文件夹,代码都放在这个下面。
图形模块由于初衷还是课程设计,所以用Dx11编写。项目结构会参考Dx11龙书以及博客园@X-Jun的文章。
这里创建了一个类 WindowsApp。
class WindowsApp {
public:
WindowsApp( HINSTANCE hInstance ); //构造函数,注意要在初始化列表中设置好参数,不然会链接错误。
virtual ~WindowsApp();
virtual LRESULT MsgProc( HWND hWND, UINT msg, WPARAM wParam, LPARAM lParam ); //消息处理的回调函数,这个函数的用处在cpp里面
int Run(); //运行程序,窗口的主循环
virtual bool Init(); //初始化函数,在WinMain入口中调用以初始化
protected:
bool InitMainWindow(); //窗口初始化
protected:
HINSTANCE m_hAppInst; //应用实例句柄
HWND m_hMainWnd; //主窗口句柄
bool m_AppPaused; //应用是否暂停
//子类在构造函数更改这些参数
LPCWSTR m_MainWndCaption; //主窗口标题
int m_ClientWidth; //视口宽带
int m_ClientHeight; //视口高度
};
具体的方法可以参考
github,需要注意的主要有两点:
- 构造函数必须使用参数列表的形式传参;
- 窗口类初始化时,要使用如下格式,或者初始化时将wc.hIconSm显式初始.
WNDCLASSEX wc = {sizeof( wc )}; "
WNDCLASSEX.hIconSm必须设置的原因是,在你的程序中作为局部变量它的值是随意的,错误的值造成RegisterClassEx失败。(这里卡了好久还以为前面写错了)。
基本窗体建立完毕后,就可以进行基本的图形绘制了。
目前我能想到的方法有:
- 直接基于windows API 绘制,就是在消息传递的 WM_PAINT 那里直接画图,不过显然不合适
- 用d2d的笔刷画图
- 通过d3d,用图形管线渲染
因为上过图形学的课,用方式3对我来说反而更简单...不过这里简单地实现一下。
在消息处理函数中直接绘图。
简单地画个矩形地话,在WindowsApp.cpp 中给MsgProc函数添加一条case语句就可以了:
case WM_PAINT:
PAINTSTRUCT ps;
HDC hdc = BeginPaint( hWND, &ps );
RECT rec = {20, 20, 60, 80};
HBRUSH brush = (HBRUSH) GetStockObject( BLACK_BRUSH );
FillRect( hdc, &rec, brush );
EndPaint( hWND, &ps );
break;
}
![](https://img2018.cnblogs.com/blog/1657167/201904/1657167-20190415151007886-215100074.png)
篇幅原因,d2d和d3d都可以单独放一篇文章
更新:
把cpp文件中的MainWindowProc()
放到了类声明中作为静态成员函数,因为如果多个构造函数(我也不知道会不会出现这种情况)的话可能会重复定义,虽然可能影响不大..
参考文章: