专属自己的二维游戏引擎【五】

  这一节到了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函数来转很简单。这样不占用太多的显示内存。

  玩家玩一次游戏,能够使用的不相同的文字字数还是有限的。

继续。。。。。。。。。。。

原文地址:https://www.cnblogs.com/GameDelphi/p/2576690.html