跳转到内容

跨平台游戏编程与 gameplay3d/文本和字体

来自 Wikibooks,开放世界的开放书籍

将字体导入 gameplay3d

[编辑 | 编辑源代码]

Gameplay3d 支持 TrueType 字体,但这些字体必须首先被转换为 gameplay 包文件(见 跨平台游戏编程与 gameplay3d/gameplay3d 设计概念#创建和导入资源),然后才能在你的项目中使用。

使用以下步骤将字体导入你的项目

  • 查找或创建 TrueType 字体文件(.ttf)。
  • 将 .ttf 文件传递给 gameplay-encoder 命令行工具,并指定你想要的尺寸。GamePlay/bin 下提供了一个预编译的 gameplay-encoder 版本
gameplay-encoder -s 28 myfont.ttf
  • gameplay-encoder 将输出一个 .gpb 文件。
  • 将 .gpb 文件复制到你的游戏的资源目录。(无需包含 .ttf 文件。)
  • 按如下方式将你的字体导入你的项目
// Create a font from the gpb file
Font* _font = Font::create("res/myfont.gpb");

使用字体绘制文本

[编辑 | 编辑源代码]

要使用字体进行渲染

  • 首先,在你的字体实例上调用 Font::start() 来开始绘制文本;
  • 其次,调用 Font::drawText() 在定义的位置绘制一些文本。此函数有四种不同的重载,参数可以在 Font.h 中找到;以及
  • 最后,调用 Font::finish() 来完成相关字体的文本批处理,并渲染所有绘制的文本。

以下是如何加载字体并使用它在屏幕上渲染游戏的帧率的示例。

void MyGame::initialize()
{
    // Create a font from the gpb file
    _font = Font::create("res/myfont.gpb");
}

void MyGame::render(float elapsedTime)
{
    // Clear the frame buffer
    clear(CLEAR_COLOR_DEPTH, Vector4(0, 0, 0, 1), 1.0f, 0);

    // Draw the text at position 20,20 using red color
    _font->start();
    char text[1024];
    sprintf(text, "FPS:%d", Game::getFrameRate());
    _font->drawText(text, 20, 20, Vector4(1, 0, 0, 1), _font->getSize());
    _font->finish();
}

void MyGame::finalize()
{
    // Use built-in macros to clean up our resources.
    SAFE_RELEASE(_font);
}

批处理

[编辑 | 编辑源代码]

可以在 Font::start()Font::finish() 之间多次调用 Font::drawText(),以便使用相同的字体在不同的位置绘制不同的文本。

使用距离场绘制高质量文本

[编辑 | 编辑源代码]

从 2.0.0 版本开始,gameplay3d 支持距离场字体。你可以在 Valve 的论文 针对矢量纹理和特殊效果的改进 Alpha 测试放大 中了解更多关于距离场字体的知识,但简而言之,距离场字体比位图字体看起来要好得多,尤其是在高放大倍率下!

要创建距离场字体,在运行 gameplay-encoder 时使用 -f:d 选项参数,例如

gameplay-encoder -s 50 -f:d myfont.ttf
华夏公益教科书