0

我正在寻找一个加载 ttf 文件(在我的情况下为Inconsolata.ttf)并创建文本层的简单示例。

是否有可能以与平台无关的方式做到这一点?从这里的回复中,我得到的印象不是。

我正在使用playn-samples 展示中的 TextDemo示例作为参考进行简单的概念验证。

我目前对如何注册 ttf 文件有点困惑。这是我的代码:

private void testCustomFont() {
    // text
    String text = "Hello, Cleveland!";

    // load font
    String fontName = "Inconsolata";
    Font.Style fontStyle = Font.Style.BOLD;
    Float fontSize = 24f;
    Font myFont = graphics().createFont(fontName, fontStyle, fontSize);

    // format text
    Integer fontColor = Color.rgb(0, 0, 255);
    TextFormat textFormat = new TextFormat().withFont(myFont).withTextColor(fontColor);

    // create font image layer
    ImageLayer textLayer = graphics().createImageLayer();
    TextLayout textLayout = graphics().layoutText(text, textFormat);
    CanvasImage textImage = graphics().createImage((int)Math.ceil(textLayout.width()), 
            (int)Math.ceil(textLayout.height()));
    textImage.canvas().drawText(textLayout, 0, 0);
    textLayer.setImage(textImage);


    // position text layer and add to root layer
    textLayer.setTranslation(20, 20);
    graphics().rootLayer().add(textLayer);
}

项目布局如下:

/project
├── core
│   └── MyProject.java
└──  resources
    └──  fonts
         └──  Inconsolata.ttf

这将显示文本,但正如预期的那样,不是以所需的字体显示。

4

2 回答 2

0

理想情况下,我希望字体加载与资产管理器的图像加载一样工作:

String fontPath = "fonts/Inconsolata.ttf";
Font.Style fontStyle = Font.Style.BOLD;
Float fontSize = 24f;
Font myFont = assetManager().getFont(fontPath, fontStyle, fontSize);

那是不可能的,所以我考虑做这样的事情:

private void registerFont() {
    if (platformType().equals(Platform.Type.JAVA)) {
        Platform platform = Platform.getJavaPlatformApi();
        platform.assets().setPathPrefix("com/klenwell/myproject/resources");
        platform.graphics().registerFont("Inconsolata", "fonts/Inconsolata.ttf");
    }
    else if (platformType().equals(Platform.Type.ANDROID)) {
        Platform platform = Platform.getAndroidPlatformApi();
        platform.assets().setPathPrefix("com/klenwell/myproject/resources");
        platform.graphics().registerFont("Inconsolata", "fonts/Inconsolata.ttf");
    }
    else if (platformType().equals(Platform.Type.HTML)) {
        // rely on CSS setting in HTML host file
    }
}

但是核心 Platform 类中没有像 getJavaPlatformApi 这样的方法。如此所述,“您必须在您打算使用的每个后端手动注册字体。”


按照TextDemo 示例的示例,这就是我在上面的示例中为 Java 和 HTML 平台加载字体的方式:

Java平台

更新Java 目录中的游戏类:

public class MyProjectJava {

  public static void main(String[] args) {
    JavaPlatform platform = JavaPlatform.register();
    platform.assets().setPathPrefix("com/klenwell/myproject/resources");
    platform.graphics().registerFont("Inconsolata", "fonts/Inconsolata.ttf");
    PlayN.run(new MyProject());
  }
}

HTML 平台

编辑HTML 快照目录下的HTML 主机文件:

<!DOCTYPE html>
<html>
  <head>
    <title>MyProject Font Loading Example</title>
    <style>
      @font-face {
        font-family: "Inconsolata";
        src: url(myproject/resources/fonts/Inconsolata.ttf);
      }
    </style>
  </head>
  <body bgcolor="black">
    <script src="myproject/myproject.nocache.js"></script>
  </body>
</html>

安卓平台

即将公布

iOS平台

即将公布

我还没有涉足 Android 或 iOS 编译,所以目前我无法提供这些示例。

于 2012-04-26T03:32:59.890 回答
0

PlayN wiki's custom fonts page似乎涵盖了您的问题。

PlayN 支持使用自定义字体,但需要针对您希望在游戏中使用的每个不同后端专门集成此类字体。所有后端都支持 TrueType (.ttf) 字体。一些后端(iOS、HTML5、Android)支持 OpenType (.otf) 字体。

主要步骤似乎是:

  1. 将字体文件添加为资产。
  2. 使用 . 为每个后端分别注册字体platform.graphics().registerFont()
  3. 使用 创建一个字体对象PlayN.graphics().createFont(),然后照常使用它。
于 2014-10-08T05:12:27.343 回答