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