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

三、创建窗口和绘制精灵与文本

(甲)创建窗口

代码如下,很简明,通过调用一系列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);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值