Texto
O FastObjects desenha texto como sprites de um atlas de glifos — cada
caractere é um quad texturizado, e um TextBatch inteiro sai em uma chamada. O
texto é construído sobre o mesmo atlas/renderer dos sprites, então é rápido e
batched.
Uma fonte e um batch de texto
import fastobjects as fo
win = fo.Window(800, 600)
font = fo.Font(size=28) # fonte embutida escalável
labels = fo.TextBatch(font, capacity=500)
labels.write("Olá, FastObjects!", x=20, y=20)
labels.write("Acentos: ação!", x=20, y=60, color=(0.6, 0.9, 1.0, 1.0))
Font(size)rasteriza um conjunto de caracteres num atlas de glifos, uma vez. O conjunto padrão cobre ASCII imprimível e Latin-1 (acentos como á, ç, ã, é funcionam por padrão). Passechars="..."para um conjunto custom.TextBatch(font, capacity)—capacityé o máximo de glifos somando todos oswritevivos.write(text, x, y, color=(1,1,1,1), anchor="topleft")retorna umSpriteGroupsobre os quads dos glifos, então você move ou recolore a string inteira:label.pos += (0, 5),label.color = (1, 0, 0, 1).
Quebras de linha (\n) começam uma nova linha; anchor="center" centraliza o
bloco de texto em (x, y).
Texto dinâmico (score, FPS)
Para texto que muda todo frame, clear() e write() de novo — sem surface por
string, sem realocação:
hud = fo.TextBatch(font, capacity=200)
@win.frame
def update(dt):
hud.clear()
hud.write(f"Score: {score}", x=20, y=20)
win.clear(0.1, 0.1, 0.1)
win.draw(hud)
Medindo
font.measure(text) retorna a (largura, altura) do bloco de uma string sem
desenhar — útil para posicionar ou centralizar por conta própria:
w, h = font.measure("Game Over")
label.write("Game Over", x=(800 - w) / 2, y=(600 - h) / 2)
Fontes customizadas
Font recebe a fonte primeiro, estilo pygame — um caminho .ttf/.otf ou o
nome de uma fonte instalada no sistema. None (o padrão) usa a fonte embutida
do Pillow.
hud = fo.Font("assets/PressStart2P.ttf", 16)
sistema = fo.Font("arial.ttf", 24) # procurada nos diretórios do sistema
Conjuntos de caracteres
O atlas rasteriza um conjunto fixo de caracteres, escolhido na construção:
fo.Font("arial.ttf", 24) # "latin" (padrão): ASCII + Latin-1
fo.Font("arial.ttf", 24, charset="cyrillic") # só Ѐ-џ — sem ASCII
fo.Font("arial.ttf", 24, charset=("latin", "greek", "cyrillic")) # texto misto
fo.Font("arial.ttf", 24, chars="0123456789/:") # controle total (vence charset)
Presets: "ascii", "latin", "latin-ext", "greek", "cyrillic".
Presets são independentes — combine-os numa tupla para texto misto. Um
caractere que o arquivo da fonte não cobre renderiza o tofu da própria
fonte; um caractere fora do charset do atlas é pulado (avança como espaço).
Texto complexo: RTL, kerning, ligaturas
Instale o extra opcional de shaping e o Font se atualiza sozinho — árabe e
hebraico saem conectados e na ordem certa, e pares de kerning se aplicam:
pip install fastobjects[shaping]
font = fo.Font("arial.ttf", 24)
font.shaped # True com o extra instalado (False = layout simples)
labels.write("سلام عليكم", x=20, y=20) # formas contextuais corretas + RTL
Com o shaping ativo o atlas contém todos os glifos da fonte (ligaturas e
formas contextuais não têm caractere próprio), então charset/chars só
escolhem quais caracteres aparecem no dict público font.glyphs. Linha que
mistura LTR e RTL usa a direção dominante detectada pelo HarfBuzz — bidi
completo é um limite conhecido. Sem o extra, o Font cai no layout simples
por caractere (suficiente para latim/grego/cirílico).
Um exemplo completo
Veja examples/text_hud.py
(labels estáticos + um contador de FPS ao vivo).