Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿
终于把SmartGUi库写了一半,基本的架子算是搭起来了
现在我打算编写博客边做开发
虽然说之前也做过GUI,但是这次还是想把这个做好点(要是一不小心和CEGUI或者MYGUI起名那就不错了哈哈)

先说GUI字体接口吧
需要说在的 这个库的定位是与具体渲染机器无关
那么我们就需要一个与具体渲染有关的插件了

很显然,对于GUI来说主要有3个部分
1.纹理/位图
2.字体
3.基本图元的绘制
当然还有其他...

下面这是基本字体的抽象基类
CORE_BEGIN_NAMESPACE

class GUI_EXPORT GFont : public Object
{
public:
    
const static int LEFT = -1;
    
const static int TOP = -1;
    
const static int CENTER = 0;
    
const static int RIGHT = 1;
    
const static int BOTTOM = 1;
public:
    
virtual ~GFont();
    
virtual gstring GetFileName()const = 0;
    
virtual int GetFontSize() = 0;
    
virtual int GetLineHeight() const = 0;
    
virtual int GetWidth(const gstring& text) const = 0;
    
virtual int GetHitCharIndex(const gstring& text,float offset)const = 0;
    
virtual void  Render(const gstring& text,const Recti& area,\
        
int halignment = CENTER,\
        
int valignment = CENTER,\
        
bool oneline = true= 0;
    DECLARE_OBJECT(GFont)
};

CORE_END_NAMESPACE

函数功能基本都看的懂
需要说明的是
1.GetHitCharIndex是本文给定偏移对于的字符标号
2.这里并没有提供一个渲染给定文本在给定位置的功能,反而提供了一个更为贴心的Render渲染文本于给定矩形-可以指定对其方式和是否为多行渲染
3.这里还没有提供一些更为复杂的字体性质,比如斜体,下划线,粗体等等

一个相关的字体工厂对象如下:
CORE_BEGIN_NAMESPACE

class GUI_EXPORT GFontFactory : public Object
{
public:
    
virtual ~GFontFactory();
    
virtual boost::shared_ptr<GFont> CreateFont(const gstring& font,int size) = 0
    DECLARE_OBJECT(GFontFactory) 
};

CORE_END_NAMESPACE
这个没什么说的,根据字体文件和字体大小生成字体指针一枚
还有一个相关对象是FontManager
接口如下:
CORE_BEGIN_NAMESPACE

class GUI_EXPORT GFontManager:
public Manager<boost::shared_ptr<GFont> >,
public GSerializer
{
public:
    
bool AddFont(const gstring& name,const gstring& font,int size,bool del = false);
    gstring GetSerializerTag(){
return "fontlist";}
    
bool Load(boost::shared_ptr<XMLNode> node);
    
bool Save(boost::shared_ptr<XMLDocument> doc,boost::shared_ptr<XMLNode>& node);
apiuse
    
void SetFontFactory(boost::shared_ptr<GFontFactory> factory);
private:
    boost::shared_ptr
<GFontFactory> factory;
    DEFINE_SINGLETON(GFontManager)
};

CORE_END_NAMESPACE

1.显然字体管理器是一个单件
2.函数SetFontFactory()是提供给插件设置具体的字体工厂的,所以这里有一个标记apiuse
3.函数GetSerializerTag,Load,Save是从对那象GSerializer继承来的,目的就是提供字体的序列化和反序列化动作-我们的GUI是要尽可能做到自动化的

在SmartGUI中,字体系统基本上就由这三个对象,以后样子改动不会太大了,也许只会增加函数接口而已

另外这个字体系统从设计模式的角度看是很容易理解的

----------------------------------------------------------标记
接口总比实现重要些.

posted on 2011-06-08 19:39 ccsdu2009 阅读(2033) 评论(1)  编辑 收藏 引用 所属分类: Game引擎
Comments
  • # re: SmartGUI库字体接口
    陈梓瀚(vczh)
    Posted @ 2011-06-09 10:26
    你最后会发现一个真正的字体类是要负责绘图的,因为游戏里面的字体跟windows的字体并不总是一样的,因为你可以选择用预先做好的图片来做文字什么的。  回复  更多评论   

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理