UE4(零)- 龙书的游戏框架

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();						//绘出每一帧的游戏世界
		}
	}

}

X_Jun 博客园-更全的DirectX11的学习

猜你喜欢

转载自blog.csdn.net/weixin_44200074/article/details/106874341