这一节到了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函数来转很简单。这样不占用太多的显示内存。
玩家玩一次游戏,能够使用的不相同的文字字数还是有限的。
继续。。。。。。。。。。。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· MQ 如何保证数据一致性?