基于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,需要注意的主要有两点:

  1. 构造函数必须使用参数列表的形式传参;
  2. 窗口类初始化时,要使用如下格式,或者初始化时将wc.hIconSm显式初始.
    WNDCLASSEX wc = {sizeof( wc )}; "

WNDCLASSEX.hIconSm必须设置的原因是,在你的程序中作为局部变量它的值是随意的,错误的值造成RegisterClassEx失败。(这里卡了好久还以为前面写错了)。



基本窗体建立完毕后,就可以进行基本的图形绘制了。

目前我能想到的方法有:

  1. 直接基于windows API 绘制,就是在消息传递的 WM_PAINT 那里直接画图,不过显然不合适
  2. 用d2d的笔刷画图
  3. 通过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;
     }




篇幅原因,d2d和d3d都可以单独放一篇文章

更新:

把cpp文件中的MainWindowProc()放到了类声明中作为静态成员函数,因为如果多个构造函数(我也不知道会不会出现这种情况)的话可能会重复定义,虽然可能影响不大..

参考文章:

  1. 从零开始手敲次世代游戏引擎(六)
  2. DirectX11 With Windows SDK--01 DirectX11初始化
posted @ 2019-04-14 19:48  bCoherence  阅读(254)  评论(0编辑  收藏  举报