三、创建窗口和绘制精灵与文本
(甲)创建窗口
代码如下,很简明,通过调用一系列SetWindow函数:
virtual void _init() override
{//初始化
sys->SetWindowTitle(L"教程01");//设置窗口标题
sys->SetWindowStyle(WS_OVERLAPPEDWINDOW);//设置窗口样式
sys->SetWindowSize(Size(800, 600));//设置窗口大小为800*600
sys->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*600
sys->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);
}