这一节到了GUI部分。
采用继承Delphi控件祖类的方式来创建GUI控件相对来说还是比较便利的。
现在因为是直接在默认的From上面绘图,所以也可以调用IDE里面的控件。
但是我们需要绘制的是PS好的图片作为GUI的外观,显然就需要自定义自己的控件类型。
说到这方面,大家都清楚,字体绘制永远是一种难言的伤痛。
中文毕竟不是英文,直到目前,很难找到一种不影响游戏性能的中文显示解决方案。
但是我觉得不管你怎么操作,实际上,游戏绘制的永远是图片。
于是,是不是可以这样操作:
角色和怪物的名称文字采用已经制作好的常用字体图片文件来绘制,这样不会影响游戏性能。
GUI控件的字体直接采用如下的做法:
BitBack := TBitmap.Create;
BitBack.Canvas.Font.Name := '微软雅黑';
BitBack.Canvas.Font.Color := clRed;
BitBack.Canvas.Font.Height := 28;
Str:='字体测试';
BitBack.Width := BitBack.Canvas.TextWidth(Str);
BitBack.Height:= BitBack.Canvas.TextHeight(Str);
BitBack.Canvas.TextOut(0, 0,Str);
或者
MyRect.Left := X;
MyRect.Top := Y;
MyRect.Right := X + 100;
MyRect.Bottom := Y + 100;
DrawText(BitBack.Canvas.Handle, str, -1, MyRect, DT_LEFT);
//BitBack.SaveToFile('D:\D2DGameEngine\引擎测试\1.BMP');
在这里提示一下,创建出来的TBitmap对象不用立即析构,不断地创建和析构会产生很多的内存碎片的。
它应该跟着控件被析构而析构。
客户端我们还是需要注意一下内存碎片的问题,为什么有些玩家玩游戏久了,系统变得超慢,就是这个问题。
引擎里面我们采用保存到流里面。
这些其实就是采用GDI的简单绘制方式。
不采用GDI+的方法,我感觉GDI+操作我们常用的内存流很不好用。
只要图片保存到了流之后,一切都简单了。至于背景颜色可以使用笔刷填充成黑色,然后调用D3D创建图像功能的一个带过滤色的函数就可以清除背景色了。
也许大家还是觉得太简单,不实用,那么你就得想下了。
玩家在使用GUI交互的时候,或者说在聊天的时候,实际上应该是处在非游戏状态之中,还需要担心游戏的帧数???
你只需要关心GUI响应的问题,就像软件应用层那样,你觉得会成问题吗?
那么聊天框也就是Memo里面的显示字体呢,不就是图片吗?
当我们在输入框里面输入完,按下回车的时候,就开始生成图片了,这个时候。。。。。
我现在感觉简单了,甚至不需要事先处理好任何字体图片。
使用过的字体,直接采用链表记录就OK,Delphi2010的泛型链表就不错。
如果没有该字体就生成。
【要记住,任何生成D3D图像之后的指针你需要保存下来,一个指针应该不大吧,实际系统内存就只有这些开销,图片在那里保存呢,你说呢?】
采用BMP这种格式其实是不提倡的,文件太大,最好转换为DDS格式,采用D3DAPI函数来转很简单。这样不占用太多的显示内存。
玩家玩一次游戏,能够使用的不相同的文字字数还是有限的。
继续。。。。。。。。。。。