剑孤寒的小站

人生的价值不是用时间,而是用深度去衡量的!
posts - 75, comments - 290, trackbacks - 0, articles - 0
     这一节我们来学习如何使用字体,首先我们要创建一个字体,在GGE中用Font_Create (LPCSTR fontname, int size=16, bool bBold=false, bool bBorder=false)函数来创建一个字体。fontname表示字体名字,可以使用任何已在操作系统中注册过的字体,如果找不到指定的字体,将使用系统默认字体。size参数表示字体大小,单位为像素,默认的字体大小为16x16像素。如果希望使用粗体字,可将bBold参数设为true。bBorder参数则用于设置是否给字体加上边框,边框的颜色也是可以设置的。

    在OnInitiate()函数中添加创建字体代码:

m_font = Font_Create("宋体"18falsetrue);
  创建成功会返回一个ggeFont指针,顺便设置一下字体边框的颜色
m_font->SetBorderColor(0xFF0000FF);

    ggeFont提供了两个函数来将文字显示在屏幕上,分别是gge::Render()gge::Print(),后者有点像printf()函数可以格式化字符串。在显示文字时可以设置文字的对齐样式,ggeFont提供了三种对齐样式:左对齐、右对齐、居中对齐,可以通过ggeFont::SetAlign()函数进行设置。

       //设置对齐样式
        Graph_RenderLine(128012860); 
        m_font
->SaveState(); //保存当前状态
        m_font->SetColor(0xFFFFFFFF);
        m_font
->SetAlign(TEXT_LEFT);
        m_font
->Render(1280"左对齐");
        m_font
->SetAlign(TEXT_CENTER);
        m_font
->Render(12820"居中对齐");
        m_font
->SetAlign(TEXT_RIGHT);
        m_font
->Render(12840"右对齐");
        m_font
->LoadState(); //恢复以前的状态

    前面代码中的ggeFont::SaveState()ggeFont::LoadState()用于保存和恢复字体状态,以免前面改变的字体状态会影响后面的文字显示,而且也不用每次改了状态后都要人肉改回来了。

    在一些游戏中可能需要让文字逐字显示出来,ggeFont提供了一个函数ggeFont::SetCharNum()来做这件事情,另外在游戏中可能需要显示一些关键字,ggeFont提供了一个颜色标签功能,使得可以在显示文字时动态改变后面的文字颜色。
        //显示一定数量的文字
        int maxChar = m_font->GetStringInfo("字体测试");
        
if (Timer_GetTime() - m_charTime > 1
        
{
            
if (m_charNum >= maxChar) m_charNum = 0;
            
else m_charNum++;

            m_charTime 
= Timer_GetTime();
        }

        m_font
->SaveState(); //保存当前状态
        m_font->SetCharNum(m_charNum); //设置显式的文字数量
        m_font->Render(0100"<cff0000>字<cffff00>体<cff00ff>测<c00ffff>试"); //显示文字
        m_font->LoadState(); //恢复以前的状态
        m_font->Print(0120"正在显示第%d个字。", m_charNum);

    这段代码先通过ggeFont::GetStringInfo()函数拿到字符串文字数量(也可以拿到字符串其它一些信息,详细说明请查看引擎文档),然后用ggeFont::SetCharNum()设置每次要显示的文字数量,在显示文字时通过在文字前加上类似<cff0000>的颜色标签来动态改变字符串中的文字颜色。

    有时候在显示一段文字时可能想要文字根据某个宽度自动换行,ggeFont提供了一个ggeFont::SetLingWidth()来做这件事情。
        //设置行间距、字间距以及换行
        m_font->SaveState();
        m_font
->SetLineSpace(4);
        m_font
->SetCharSpace(2);
        m_font
->SetLineWidth(140);
        m_font
->Render(0180"这段文字的行间距为4,字间距为2,每行如果超过140个像素则自动换行。");
        m_font
->LoadState();
    以上介绍了ggeFont的一些常用功能,还有一些例如裁剪、阴影等功能就不一一举例了,文档里都有详细说明。


Feedback

# re: Galaxy2D游戏引擎教程5 - 使用字体  回复  更多评论   

2011-08-26 20:49 by nana
博主你好,用3.6版本测试以上程序,发现Font类的SaveState()和LoadState()函数取消了;颜色标签效果好像也没有了,求解答。

# re: Galaxy2D游戏引擎教程5 - 使用字体  回复  更多评论   

2011-08-29 09:16 by 剑孤寒
Font类的颜色标签已经取消了,因为已经提供了ggeGuiRichText支持图文混排等各种高级文字功能,有了ggeGuiRichText后SaveState()/LoadState()函数也不需要了,因为每个ggeGuiRichText内部状态是自己管理的,不需要再那么麻烦的人肉管理字体状态了

# re: Galaxy2D游戏引擎教程5 - 使用字体[未登录]  回复  更多评论   

2015-11-04 11:36 by shepherd
ggeFont使用出错。
首先是在初始化函数中生成:
debug = Font_Create ("./ui/font/STFANGSO.TTF", 16, FONT_MODE_DEFAULT);
然后设置:
debug->SetColor(0xFF00FFFF);
debug->SetBlendMode(BLEND_COLORMUL | BLEND_ALPHAMUL | BLEND_ZWRITE);
再在渲染函数中:
debug->SetZ(0.01f);
debug->Render(0.0f, 0.0f, "10086");

输出窗口无任何显示。请在线DEBUG,呵呵

# re: Galaxy2D游戏引擎教程5 - 使用字体  回复  更多评论   

2015-11-07 22:12 by 剑孤寒
@shepherd
已经试过了,木有发现问题,你发个能重现问题的小程序以及相关字体到我邮箱吧

# re: Galaxy2D游戏引擎教程5 - 使用字体[未登录]  回复  更多评论   

2015-11-08 04:17 by shepherd
已发!
多谢!!

# re: Galaxy2D游戏引擎教程5 - 使用字体  回复  更多评论   

2015-11-08 11:38 by 剑孤寒
@shepherd
你的代码页设置有问题,应该用936,其实如果你只是做中文游戏就不需要修改这个设置,除非你要做其他语言的游戏如日/韩游戏才需要修改这个设置

# re: Galaxy2D游戏引擎教程5 - 使用字体[未登录]  回复  更多评论   

2015-11-08 20:56 by shepherd
已正常运行,多谢!正在找一种合适的字体,要中英文显示都看得过去,似乎不太容易找呢

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理