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

ただし、コアプラットフォームクラスには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>

Androidプラットフォーム

発表される

iOSプラットフォーム

発表される

私はまだAndroidやiOSのコンパイルに挑戦していないので、現時点ではそれらの例を提供することはできません。

于 2012-04-26T03:32:59.890 に答える
0

あなたの質問は、PlayN wiki のカスタム フォント ページでカバーされているようです。

PlayN はカスタム フォントの使用をサポートしていますが、そのようなフォントは、ゲームで使用するさまざまなバックエンドごとに特別に統合する必要があります。TrueType (.ttf) フォントは、すべてのバックエンドでサポートされています。OpenType (.otf) フォントは、一部のバックエンド (iOS、HTML5、Android) でサポートされています。

主な手順は次のようです。

  1. フォント ファイルをアセットとして追加します。
  2. を使用して、バックエンドごとに個別にフォントを登録しplatform.graphics().registerFont()ます。
  3. を使用してフォント オブジェクトを作成し、PlayN.graphics().createFont()通常どおり使用します。
于 2014-10-08T05:12:27.343 に答える