网络游戏demo开发范例:多人在线RPG游戏(MMO RPG)demo的开发记录(第16篇)

网络游戏demo开发实例:多人在线RPG游戏(MMO RPG)demo的开发记录(第16篇)
本篇地址 http://blog.csdn.net/changjixiong/article/details/8078614,转载请注明出处

version18  csdn下载地址请猛击这里

主要内容:增加了MessageOut类用来控制客户端文字输出的颜色和字体

所属部分:客户端 服务器端

代码地址 https://github.com/changjixiong/MMO-RPGGame/downloads, 如何获得代码,请参考如何用SVN从github上检出代码的不同版本

邮件地址:changjixiong@gmail.com

本系列目录


在上一版中,客户端左上角,以及人物的信息输出的文字是这样的

网络游戏demo开发范例:多人在线RPG游戏(MMO RPG)demo的开发记录(第16篇)


我想把字弄成别的颜色,比如,红色,我用SetTextColor设置hdcCanvas的前景色为红色,然后输出的文字是这样的

网络游戏demo开发范例:多人在线RPG游戏(MMO RPG)demo的开发记录(第16篇)

人也红了,嗯,或者可以用来做人物狂暴状态的效果,不过脚下的影子要是黑色才对。考虑到后面可能有很多的文字输出,比如人物名字正常是白色,杀人以后是红色,聊天框,被攻击掉血-100这样,还有不同的怪的名字颜色不同,比如普通怪是白色,掉宝多的怪是金色,所以,这个东西,需要分离出来控制,于是就有了类MessageOut。


MessageOut都有些啥,下面逐项的说明

每个MessageOut有下面的2个HDC,一个是要输出的内容,一个是用来打洞的掩膜

	HDC hdcContent;
	HDC hdcMask;

创建HDC以后,再创建2个HBITMAP

HBITMAP hbitContent;
HBITMAP hbitMask;

然后,用SelectObject将2个HBITMAP分别选进HDC,现在这2个HDC的内容是这个样子(2个黑色矩形,尺寸是在MessageOut对象创建的时候确定的)

网络游戏demo开发范例:多人在线RPG游戏(MMO RPG)demo的开发记录(第16篇)

然后,将白色画刷选进hdcMask

hbrOldMask = (HBRUSH)SelectObject(hdcMask, WHITE_BRUSH);
创建一个黑色画刷选进hdcContent

	hbrBlack = CreateSolidBrush(RGB(0x00, 0x00, 0x00));
	hbrOldContent = (HBRUSH)SelectObject(hdcContent, hbrBlack);

将hdcContent的文本设置蓝色,并将文本背景设置为透明

SetBkMode(hdcContent, TRANSPARENT);
SetTextColor(RGB(0x00, 0x00, 0xff));

用画刷分别刷一下,由于画刷有边框,所以刷的范围向外扩一的像素的圈

Rectangle(hdcContent, -1, -1, width+1, height+1);
Rectangle(hdcMask, -1, -1, width+1, height+1);

把文字输出到2个HDC上

	TextOut(hdcContent, 0, 0, strMsg.c_str(), strMsg.length());
	TextOut(hdcMask, 0, 0, strMsg.c_str(), strMsg.length());

现在这个2个HDC,直接贴出来是这个样子

网络游戏demo开发范例:多人在线RPG游戏(MMO RPG)demo的开发记录(第16篇)


用这2个HDC,就可以用透明背景贴图的方式输出蓝色文字了

将hdcMask用SRCAND模式贴上去,

	BitBlt(hdcDest,
			x,y,
			width, height,
			hdcMask,
			0,0,
			SRCAND);


就成了这个样子,注意,那些黑色的,不是字,是洞!!

网络游戏demo开发范例:多人在线RPG游戏(MMO RPG)demo的开发记录(第16篇)

再将hdcContent用SRCPAINT模式贴上去

	BitBlt(hdcDest,
			x,y,
			width, height,
			hdcContent,
			0,0,
			SRCPAINT);

就成了这个样子,

网络游戏demo开发范例:多人在线RPG游戏(MMO RPG)demo的开发记录(第16篇)


在构造的时候,使用的字高是12,字粗是FW_THIN,创建的字体起了作用,最后就成了这个样子

网络游戏demo开发范例:多人在线RPG游戏(MMO RPG)demo的开发记录(第16篇)

然后,就是不停地用黑白画刷分别把HDC上的文字刷掉,再TextOut,再bitblt


如果不喜欢,可以在构造的时候,使用别的字体,用void MessageOut::SetTextColor(COLORREF color)函数来设置文本颜色


比如,主角的文字就是白色(也可以在杀人以后设置为红色,红名,hoho~)

网络游戏demo开发范例:多人在线RPG游戏(MMO RPG)demo的开发记录(第16篇)


最后,有没有人发现小地图上代表自己的那个点是白的,代表其他玩家的点是蓝的,具体请查看

void GameMap::DrawMini(HDC hdcDest, const vector<Sprite *> & vecPplayer)

网络游戏demo开发范例:多人在线RPG游戏(MMO RPG)demo的开发记录(第16篇)