gohud

A legibilidade é medida

← Temas

"Bonito" é gosto; "legível" dá para medir. Um texto cinza fraco fica bem em um bom monitor e some em um celular sob a luz do dia — escolher no olho garante que isso vai acontecer mais cedo ou mais tarde.

python3 addons/gohud/tools/check_contrast.py
O quêExigido
Texto corrido4.5 : 1
Texto grande (24px ou mais)3 : 1
Bordas e ícones de destaque3 : 1
Bordas decorativas2 : 1 — a WCAG não aplica a regra de 3:1 a elementos decorativos
Superfícies adjacentes1.12 : 1 — o suficiente para um cartão se ler como separado do fundo

Texto de um matiz sobre uma tonalização do mesmo matiz

Essa armadilha apareceu três vezes neste código — botões pressionados (painel de destaque, rótulo de destaque), botões de perigo e chips. Fica bonito em uma amostra de cor e desmorona no instante em que é medido, porque os dois compartilham o matiz e, por isso, não têm diferença de luminosidade.

Por isso as cores dos rótulos não são escolhidas na mão. O gerador de temas e o GoSkin empurram a luminosidade — e só a luminosidade — até o limite ser vencido sobre o painel em que o texto de fato está. O matiz e a saturação sobrevivem, então a paleta mantém o caráter dela e mudá-la mantém o contraste.

Cor lida como texto e cor pintada como área querem coisas opostas

Em um tema claro, uma cor de aviso precisa escurecer para continuar legível como texto (#96500A). Quando o preenchimento da barra herda isso, a barra de experiência fica marrom. A cor sozinha não resolve: o amarelo é intrinsecamente claro, então nem sobre trilho cinza nenhum ele alcança 3:1, e escurecer o trilho piora (1.52 → 1.06).

Por isso os dois são separados. A cor continua viva — a paleta carrega cores só de preenchimento, como warning_vivid. A borda carrega o contraste — o GoSkin desenha um contorno de 1dp em todo preenchimento que não alcança 3:1 contra o trilho dele, então "o quanto ela está cheia" continua legível.

MY_LIGHT = dict(
    warning=hexc("9A5407"),         # lida como texto
    warning_vivid=hexc("F2A007"),   # pintada na barra
)
Deixar de fora é reportado. Sem um *_vivid, um preenchimento que sai escuro faz o gerador imprimir the bar looks drab — add warning_vivid to the palette (em coreano: "a barra está sem graça — acrescente warning_vivid à paleta"). Um ponto que antes se degradava em silêncio agora avisa.

Um painel flutuante não sabe o que está atrás dele

Um HUD é desenhado sobre o jogo — um campo de neve, ou uma caverna. Se o painel dele é translúcido, o que estiver atrás vaza através e muda a cor do painel, levando junto o contraste do texto. Com 82% de opacidade, o texto esmaecido dos temas escuros caiu para 3.74:1 sobre um fundo claro — abaixo do mínimo.

Por isso os painéis translúcidos são medidos com branco puro e preto puro atrás deles; é o pior que uma cena de jogo tem a oferecer. O painel de HUD dos temas que acompanham o pacote é opaco o bastante para passar (92%), mantendo o aspecto de vidro.

Pelo mesmo motivo, as cores dos ícones também não são fixas. O glifo do slot rápido estava cravado em branco no código e mediu 1.11:1 em um tema claro — agora ele acompanha o painel em que está, exatamente como os rótulos.

Dois verificadores, dois alcances. O check_contrast.py lê os arquivos de tema; as cores que uma skin mistura em tempo de execução (chips, slots) são medidas pela seção skin contrast da suíte, dentro do Godot.