pyxen.Text

ビットマップフォントを使用して Entity にテキスト文字列をレンダリングします。

テキストエンティティはレンダリングにフォントアトラスを使用します。各文字はアトラステクスチャからクワッドとして描画されます。


コンストラクタ

Text(
    content,
    *,
    font="_default",
    color=None,
    align="left"
)

パラメータ

パラメータ型説明
contentstr表示するテキスト文字列
fontstrフォントアセットの名前(デフォルト:組み込みフォント)
color(r, g, b, a)色調(デフォルト:白)
alignstrテキストの配置:"left"、"center"、"right"

content(必須)

レンダリングするテキスト文字列です。

Text("Hello World")

font(オプション)

使用するフォントアセットの名前です。省略した場合、組み込みのデフォルトフォントが使用されます。

Text("Score: 0", font="myfont")

フォントアセットは .font.json ディスクリプタと .font.png アトラス画像で構成されます。


color(オプション)

レンダリングされるテキストに色を付けます。

Text("Warning!", color=(1, 0, 0, 1))

デフォルト:(1.0, 1.0, 1.0, 1.0)(白、完全不透明)。


align(オプション)

エンティティの位置を基準とした水平方向のテキスト配置を制御します。

Text("Centered", align="center")
値説明
"left"エンティティの位置からテキストが始まる(デフォルト)
"center"エンティティの位置を中心にテキストが配置される
"right"エンティティの位置でテキストが終わる

テキストの割り当て

スポーン時に割り当てることができます:

label = world.spawn(
    text=Text("Score: 0"),
    x=10, y=10, layer=200
)

後から割り当てることもできます:

label.text = Text("Game Over", color=(1, 0, 0, 1))

実行時のテキスト更新

エンティティを通じてテキストコンポーネントにアクセスし、プロパティを更新できます:

label.text.content = "Score: 100"
label.text.color = (1, 1, 0, 1)
label.text.align = "center"

フェードと色付け

テキストエンティティの alpha、r、g、b はスプライトと同じように Tween できます(entity.tween() を参照)。毎フレーム text.color を設定しなくても、飛び出したスコアをフェードできます:

label.tween("alpha", to=0, duration=0.4, delay=0.3)  # 少し待ってからスコアがフェード
label.tween("b", to=0, duration=0.2)                 # 白が黄色に

テキストの削除

テキストを None に設定すると削除されます:

label.text = None

画面上かワールド内か

テキストのエンティティはスプライトと同じくワールドの中にあります。カメラが動けば一緒に動き、カメラのズームで拡大縮小されます。画面に固定する HUD(スコア、残機、メッセージ)には、テキストをカメラの子として生成します。x と y は画面の中心から測られ、カメラが動いても画面上の位置は変わりません。

cam = world.spawn(camera=Camera())
label = world.spawn(parent=cam, x=-150, y=-80, layer=200, text=Text("Score: 0"))

使用例

この例では、スコアをモジュール変数ではなくラベルのコンポーネントに保持します。

from pyxen import *

def start():
    cam = world.spawn(camera=Camera())
    label = world.spawn(
        parent=cam, x=-150, y=-80, layer=200,
        text=Text("Score: 0", color=(1, 1, 1, 1))
    )
    label.score = {"value": 0}

def update():
    for label in world.all("score"):
        label.score.value += 1
        label.text.content = "Score: " + str(label.score.value)