日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【DND图形库】二、创建控制台窗口和游戏循环

發(fā)布時(shí)間:2024/9/30 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【DND图形库】二、创建控制台窗口和游戏循环 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

二、創(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。