2

在使用 Iw2D 完成的游戏中,我想使用 IwGx 模块支持的 TTF 字体。我读到将 IwGxFont 模块与 Iw2D 一起使用是可行的,但由于文本没有出现,我必须遗漏一些东西。它编译并运行,只是没有文本。

代码:

Iw2DInit();
DPI::dpiInit();
IwResManagerInit();
IwGxFontInit();
IwGetResManager()->LoadGroup("IwGxFontTTF.group");
font = (CIwGxFont*)IwGetResManager()->GetResNamed("Serif_6", "CIwGxFont");
...
while (!s3eDeviceCheckQuitRequest()) {
    s3ePointerUpdate();
    s3eKeyboardUpdate();
    if (s3eKeyboardGetState(s3eKeyAbsBSK) & S3E_KEY_STATE_DOWN) {
        break;
    }

    current_time = s3eTimerGetMs();
    const float dt = (current_time - last_frame_time)/1000.0f;
    last_frame_time = current_time;

    Iw2DSurfaceClear(0xffffffff);
    game->draw(dt);

    IwGxFontSetCol(0xffa0a0a0);
    IwGxFontSetRect(CIwRect(10,40,(int16)IwGxGetScreenWidth()-20,40));
    IwGxFontSetAlignmentVer(IW_GX_FONT_ALIGN_BOTTOM);
    IwGxFontSetFont(font);
    IwGxFontDrawText("Lorem ipsum dolor sit amet");
    IwGxFlush();
    Iw2DSurfaceShow();

    s3eDeviceYield(0);
    logger.log(dt);
 }
4

2 回答 2

4

给定的代码缺少调用 Iw2DFinishDrawing。应该:

Iw2DSurfaceClear(0xffffffff);
game->draw(dt);
Iw2DFinishDrawing();

IwGxFontSetCol(0xffa0a0a0);
IwGxFontSetRect(CIwRect(10,40,(int16)IwGxGetScreenWidth()-20,40));
IwGxFontSetAlignmentVer(IW_GX_FONT_ALIGN_BOTTOM);
IwGxFontSetFont(font);
IwGxFontDrawText("Lorem ipsum dolor sit amet");
IwGxFlush();
Iw2DSurfaceShow();
于 2012-11-18T15:34:04.173 回答
2

好吧,我只知道您必须使用FontBuilder工具为字体创建 .gx 文件,并且只能使用这些字体。该IwGxFont模块仅适用于 .gx 字体文件。您使用的方法只能用于 gx 字体。

所以如果你想使用TTF字体,要么有任何其他方法,要么根本没有其他方法,除了将字体转换为GX格式。

编辑:-

在阅读了api之后,我知道还有另一种使用TTF字体的方法,虽然你的问题已经解决了。我想我应该更正我的答案。方法是使用 ttf 字体到具有预定义大小和样式的组文件中,就像 fontbuilder 工具在创建 gx 字体时所做的那样。在组中添加以下行将允许 ttf 字体能够从 IwResManager 加载。

CIwGxFont
{
    name "Serif_8"

    ttf ".\Fonts\serif.ttf"
    ttfPointSize 8
}
于 2012-11-17T05:47:46.443 回答