对于PlayN,有人可以提供一个简单的代码示例来说明如何加载字体文件吗?

时间:2012-04-25 04:06:37

标签: playn

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

是否可以以平台无关的方式执行此操作?从这个回复here,我得到的印象不是。

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

我现在对如何注册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

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

2 个答案:

答案 0 :(得分: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的方法。所以如前所述here,“你必须在你打算使用的每个后端手动注册字体。”


按照TextDemo sample的示例,我将在上面的示例中为Java和HTML平台加载字体:

Java平台

在Java目录中更新game class

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 host file

<!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>

Android平台

待宣布

iOS平台

待宣布

我还没有尝试过Android或iOS编译,所以我不能提供目前的例子。

答案 1 :(得分:0)

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

  

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

主要步骤似乎是:

  1. 将字体文件添加为资产。
  2. 使用platform.graphics().registerFont()
  3. 为每个后端分别注册字体
  4. 使用PlayN.graphics().createFont()创建字体对象,然后照常使用。