06/20/2020
前言
最近三个月,我学习完基础C++和基础图形数学之后,进一步开始学习微软DirectX11中的Direct3D图形接口,第一本推荐书籍,肯定是龙书啦~,(全名:Introduction to Game programming with DirectX 11)。龙书一开始有提供游戏引擎的基本架构。
龙书中的游戏引擎架构
以D3DApp框架
因为DirectX11 属于微软的,与它相关的是WIN32 API来提供App的入口函数,并且创建窗口
class D3DApp
{
public:
int run();
virtual bool init(); //初始化
virtual void onResize(); //窗口发生大小变动
virtual void updateScene(float dt) = 0; //更新游戏世界
virtual void drawScene() = 0; //绘制游戏世界
virtual LRESULT MsgProc(HWND,UINT msg,WPRAM wParm,LParam); //窗口消息回调 ,可以接受键盘鼠标的接受,窗口改变情况,退出窗口等消息
GameTimer* mTimer; //游戏时间
Keyboard* mKeyboard; //键盘
Mouse* mMouse; //鼠标
};
游戏世界准备阶段
窗口和显卡
一开始先准备工作,一个游戏世界的诞生需要游戏窗口,时间,绘图工具吧
bool D3DApp::init()
{
if(!InitMainWindow())
return false;
if(!initDirect3D())
return false;
//游戏时间,键盘,鼠标的初始化也可以放在这里,或者作为全局变量
mKeyboard = new Keybord;
mMouse = new Mouse;
mTimer = new GameTimer;
return true;
}
- initMainWindow初始窗口任务:提供一个窗口,像一个画板,画在哪里并且确定画板初始的宽高,并且提供外部可以进入内部的消息的渠道,比如窗口改变,用户输入等等消息
- initDirect3D初始图形接口: 提供画家本身,所以需要初始化显卡,并且需要多重采样,交换链和深度/模板缓冲区技术来提升画家的能力
游戏世界的运行阶段
游戏世界是永久存在的,连续的,所以是一个死循环或者达到某一个停止条件
void D3DApp::run()
{
Msg msg = {0};
while(msg.messge !=WM_QUIT) //接受到窗口退出的消息,这个消息来自于游戏世界的外部
{
if(PeekMessage(&msg,0,0,0,PM_REMOVE)) //查看消息
{
TranslateMessage(&msg); //翻译消息,消息来自于硬件,比如用户的输入
DispatchMessage(&msg); //发布消息, -> 窗口 -> 回调函数 -> 操作系统,处理消息
}else
{
mTimer.Tick(); //计算每一帧的时间并赋值给deltaTime
//游戏世界执行
updateScene(mTimer.deltaTime()); //每一帧更新游戏世界
drawScene(); //绘出每一帧的游戏世界
}
}
}