【DND图形库】三、创建窗口和绘制精灵
三、創(chuàng)建窗口和繪制精靈與文本
(甲)創(chuàng)建窗口
代碼如下,很簡(jiǎn)明,通過調(diào)用一系列SetWindow函數(shù):
virtual void _init() override {//初始化sys->SetWindowTitle(L"教程01");//設(shè)置窗口標(biāo)題sys->SetWindowStyle(WS_OVERLAPPEDWINDOW);//設(shè)置窗口樣式sys->SetWindowSize(Size(800, 600));//設(shè)置窗口大小為800*600sys->SetWindowCenter();//居中窗口sys->SetWindowShow(true);//顯示窗口time->SetFPS(120);//設(shè)為0以不限制幀數(shù)(默認(rèn)為60) }其中Size是代表大小的一個(gè)類,具有寬和高兩個(gè)成員,也可以如下調(diào)用省略類型:
sys->SetWindowSize({800, 600});//設(shè)置窗口大小為800*600其中WS_OVERLAPPEDWINDOW是MSDN定義的窗口樣式,更多樣式在此。
選中WS_OVERLAPPEDWINDOW按F12也能轉(zhuǎn)到它的定義,如下:
#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | \WS_CAPTION | \WS_SYSMENU | \WS_THICKFRAME | \WS_MINIMIZEBOX | \WS_MAXIMIZEBOX)可以發(fā)現(xiàn)它是許多樣式的組合,使用了|(位或)操作符,最后的右斜杠只是為了宏定義的換行,等價(jià)于
#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THI...//后面省略了?(乙)繪制精靈
精靈在游戲編程里指的是可動(dòng)的圖像,簡(jiǎn)單說就是繪制的一個(gè)圖像。比如說一個(gè)物品圖像、一個(gè)金幣圖像等。英文稱Sprite,首先我們定義個(gè)精靈的指針數(shù)組用于容納精靈(定義為T01的成員)。
const UINT32 GAME_SPR_NUM = 5; Sprite* _arrSpr[GAME_SPR_NUM];1.創(chuàng)建純色精靈
_arrSpr[0] = canvas->CreateSprite(0, Quad({}, {64, 64}, true), Color::GREEN); _arrSpr[0]->GetCoor()->SetPosition({ 400, 300 });canvas是默認(rèn)的畫布,DND通過畫布(Canvas)創(chuàng)建精靈。如上所示傳入0代表沒有圖像(為純色),Quad指定了精靈的大小,上面是64*64大小,并且居中。最后Color指定了精靈的顏色(綠色)。
第二行,我們調(diào)用GetCoor函數(shù)獲取精靈的坐標(biāo)系(Coor),然后設(shè)置位置為400,300。
2.創(chuàng)建有圖像的精靈
首先我們需要加載一張圖片,使用Image類(確保文件存在,或者自行拷貝一個(gè)png圖像試試)。
Image* img = Image::Create(L"Data\\Image\\cat.png");然后將加載的圖像傳入到CreateSprite函數(shù),再調(diào)整一下位置,如下所示:
Image* img = Image::Create(L"Data\\Image\\cat.png"); _arrSpr[1] = canvas->CreateSprite(img); _arrSpr[1]->GetCoor()->SetPosition({ 400, 300 }); delete img;3.繪制
在幀函數(shù)調(diào)用Render(繪制)即可:
for (UINT32 i = 0; i != GAME_SPR_NUM; ++i) {if(_arrSpr[i])_arrSpr[i]->Render(); }4.效果圖是這樣的
5.資源釋放?
我遵循一個(gè)原則是,析構(gòu)函數(shù)調(diào)用了delete,則構(gòu)造函數(shù)必須賦初值NULL。所以在T01的構(gòu)造函數(shù)和_release各加入相關(guān)代碼:
T01() {for (auto& iter : _arrSpr)iter = NULL; } virtual void _release() override {//結(jié)束for (auto& iter : _arrSpr)DELETE_SPRITE(iter);//使用DELETE_SPRITE刪除精靈 }(丙)完整代碼
#include <DND.h> using namespace DND;const UINT32 GAME_SPR_NUM = 5; class T01 : public Game { public:Sprite* _arrSpr[GAME_SPR_NUM];T01(){for (auto& iter : _arrSpr)iter = NULL;}virtual void _update() override{//幀函數(shù)for (UINT32 i = 0; i != GAME_SPR_NUM; ++i){if(_arrSpr[i])_arrSpr[i]->Render();}}virtual void _init() override{//初始化_arrSpr[0] = canvas->CreateSprite(0, Quad({}, {64, 64}, true), Color::GREEN);_arrSpr[0]->GetCoor()->SetPosition({ 400, 300 });Image* img = Image::Create(L"Data\\Image\\cat.png");_arrSpr[1] = canvas->CreateSprite(img);_arrSpr[1]->GetCoor()->SetPosition({ 400, 300 });delete img;sys->SetWindowTitle(L"教程01");//設(shè)置窗口標(biāo)題sys->SetWindowStyle(WS_OVERLAPPEDWINDOW);//設(shè)置窗口樣式sys->SetWindowSize({800, 600});//設(shè)置窗口大小為800*600sys->SetWindowCenter();//居中窗口sys->SetWindowShow(true);//顯示窗口time->SetFPS(120);//設(shè)為0以不限制幀數(shù)(默認(rèn)為60)}virtual void _release() override{//結(jié)束for (auto& iter : _arrSpr)DELETE_SPRITE(iter);} };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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【DND图形库】二、创建控制台窗口和游戏
- 下一篇: 【DND图形库】四、文本绘制和按键检测