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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【DND图形库】三、创建窗口和绘制精灵

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

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

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