【DND图形库】二、创建控制台窗口和游戏循环
二、創(chuàng)建控制臺(tái)窗口和游戲循環(huán)
(甲)為何我們需要?jiǎng)?chuàng)建控制臺(tái)窗口
雖然游戲需要的是Windows窗口,但是這個(gè)窗口可以幫助我們查看即時(shí)的調(diào)試信息,不輸出調(diào)試的程序就和不寫注釋的程序一樣,后來修改的人總是很難受(也可能是自己跳這個(gè)坑)。
(乙)創(chuàng)建
我們直接在上一章的Tutorial_01項(xiàng)目里進(jìn)行修改,DND有一個(gè)控制臺(tái)調(diào)試類(DebuggerConsole),如下使用即可
DebuggerConsole debug;//定義Debugger調(diào)試器變量 Debug::SetDebugger(&debug);//傳給Debug設(shè)置DND最核心的類是Game類,用戶需要繼承它實(shí)現(xiàn)一個(gè)類,假設(shè)我們就取名為T01:
class T01 : public Game { public:virtual void _update() override{//幀函數(shù)debug_info(L"update");}virtual void _init() override{//初始化}virtual void _release() override{//結(jié)束} };其中_update函數(shù)是會(huì)一直循環(huán)執(zhí)行的函數(shù),稱為幀函數(shù)。假設(shè)游戲有60幀,那么一秒鐘此函數(shù)執(zhí)行60次。
_init函數(shù)用于寫一些加載資源初始化的代碼,_release是程序結(jié)束之前調(diào)用的函數(shù)。
在幀函數(shù)里,我們用debug_info函數(shù)輸出了文本"update",學(xué)過C語言都知道,雙引號(hào)括起來是字符串。而在前面加L的含義是,雙字節(jié)字符串。也就是wchar_t類型,是占兩個(gè)字節(jié)的,而char只占一個(gè)字節(jié),也就是8位,只能表示[0, 255],所以在以前用兩個(gè)char表示更多的文字符號(hào)。而現(xiàn)在更先進(jìn)的直接用wchar_t表示字符了,比如上一章用到的MessageBox,實(shí)際上是一個(gè)宏,實(shí)際微軟實(shí)現(xiàn)了兩個(gè)MessageBox函數(shù),一個(gè)用char傳參,一個(gè)用wchar_t傳參。為了代碼兼容不用修改,就做了如下處理:
#ifdef UNICODE #define MessageBox MessageBoxW #else #define MessageBox MessageBoxA #endif // !UNICODE可以看到,定義了UNICODE宏,則MessageBox為MessageBoxW,否則為MessageBoxA。C和C++的標(biāo)準(zhǔn)庫函數(shù)也定義了兩套函數(shù),加w前綴或后綴的就是使用的寬字符(wchar_t)作為參數(shù)。比如字符串拷貝函數(shù)就分為了strcpy與wcscpy。
回到正題,由于需要使用到DND圖形庫默認(rèn)的資源,以及加載dll,需要設(shè)置工作路徑,也就是程序讀取文件的根目錄,如下圖所示:
現(xiàn)在再回到代碼層面,T01的內(nèi)容已經(jīng)寫好,需要定義一個(gè)T01全局變量,接著在主函數(shù)里,如下調(diào)用:
T01 g_t01;DNDMain() {g_t01.Init();//初始化 DND庫g_t01.EnterLoop();//進(jìn)入游戲循環(huán)g_t01.Release();//釋放資源 }其中Init函數(shù)會(huì)初始化庫,EnterLoop函數(shù)就進(jìn)入了游戲循環(huán),等到EnterLoop結(jié)束,才會(huì)執(zhí)行Release函數(shù)釋放庫的資源,最后才結(jié)束了程序。
這次的運(yùn)行就會(huì)輸出許多的日志了,等到庫的資源初始化完畢,就會(huì)一直循環(huán)執(zhí)行_update()函數(shù)我們所寫的代碼:
最后反復(fù)執(zhí)行輸出update:
只輸出一個(gè)文本實(shí)在太無趣了,我們可以這樣輸出FPS:
virtual void _update() override {//幀函數(shù)//將無符號(hào)整形UINT32轉(zhuǎn)為字符串StringString str = String::Format(256, L"FPS: %u", time->GetRealFPS());debug_info(str);//打印FPS } virtual void _init() override {//初始化time->SetFPS(0);//設(shè)為0以不限制幀數(shù)(默認(rèn)為60) }運(yùn)行結(jié)果如下,可以看到FPS有900多,實(shí)際上創(chuàng)建窗口后什么都不輸出,FPS可以到四五千。往控制臺(tái)打印字符串實(shí)際是比較慢的操作。
(丙)完整代碼
#include <DND.h> using namespace DND;class T01 : public Game { public:virtual void _update() override{//幀函數(shù)String str = String::Format(256, L"FPS: %u", time->GetRealFPS());debug_info(str);}virtual void _init() override{//初始化time->SetFPS(0);//設(shè)為0以不限制幀數(shù)(默認(rèn)為60)}virtual void _release() override{//結(jié)束} };T01 g_t01;DNDMain() {DebuggerConsole debug;Debug::SetDebugger(&debug);g_t01.Init();g_t01.EnterLoop();g_t01.Release();//MessageBox(NULL, L"Hello World!", L"標(biāo)題欄", MB_OK); }?
總結(jié)
以上是生活随笔為你收集整理的【DND图形库】二、创建控制台窗口和游戏循环的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++标准库中的随机数生成
- 下一篇: 【DND图形库】三、创建窗口和绘制精灵