gohud

HUD

← Widgets

Ce sont les petites choses qui décident si c'est réussi

Peaufinez les grands panneaux tant que vous voulez — ce qui accroche l'œil est toujours un détail : un mot coupé en deux, un halo tronqué, un emplacement à l'étroit. Quatre détails de ce genre ont été signalés le 2026-09-13 et corrigés dans les widgets et les thèmes, pas dans l'écran de démo, pour que tous les écrans en profitent de la même façon.

Ce qui se voyaitCauseCorrection
Le Done du repère guidé devenait Don/e Un bouton dont le retour à la ligne est actif retranche la largeur de son texte de son minimum — serrez-le et il coupe au milieu d'un mot GoStyle.fit_words() : un mot seul ne se coupe jamais ; plusieurs mots peuvent passer à la ligne, mais le mot le plus long tient toujours — jugé sur le texte affiché, pas sur la clé de traduction, et réappliqué par le formulaire au changement de langue
Le halo d'un bouton pleine largeur était coupé verticalement à gauche Un conteneur défilant rogne à son bord, sans exception. Seule la droite survivait, grâce à la gouttière de la barre GoScroll emprunte la marge intérieure du parent pour repousser son bord de 12 dp vers l'extérieur et la rend à l'intérieur — le contenu ne bouge pas
Temps, icône et quantité empilés verticalement dans un emplacement Trois rangées dans 48 dp Icône en grand au centre, raccourci en haut à gauche, quantité en badge en bas à droite, temps restant en badge par-dessus l'icône — les panneaux de badge viennent du badge_box() du skin
Une liste déroulante plate sans sélection visible Le survol d'un élément utilisait le panneau de bouton ; les marques radio étaient celles, pâles, du moteur Un panneau de survol dédié (teinte d'accent douce), la même illustration radio que les cases à cocher, une hauteur d'élément calibrée pour le tactile
Une liste déroulante ouverte — panneau de survol à l'accent doux et marque radio de l'élément choisi
Liste déroulante — panneau de survol et marque radio
Quatre emplacements rapides — raccourci en haut à gauche, badge de quantité en bas à droite, le premier avec un badge de temps restant
Emplacements — badges d'angle et temps restant (science-fiction)

Donnez une description aux boutons sans libellé avec GoStyle.icon_button(icon, action, -1, tooltip_key) — l'infobulle pour les utilisateurs de souris et le nom d'accessibilité pour les lecteurs d'écran viennent tous deux de cette seule valeur. gohud dessine l'infobulle lui-même : celle du moteur découpe le texte à raison d'un caractère par ligne quand son calcul de largeur se trompe (mesurée à 1 dp de large).

La carte du repère guidé se tient à l'écart des éléments fixes

En paysage, la carte était envoyée tout en haut ou tout en bas — exactement là où vivent les en-têtes et les éléments de HUD ; dans la démo, elle se posait sur le → × de l'en-tête. Elle reste désormais à la hauteur de sa cible, contourne tout GoHudAnchor qui réserve de la place, et accepte d'autres choses à éviter via keep_clear. Elle se déplace de la plus courte distance qui dégage l'obstacle sans couvrir la cible, et ne bouge pas quand l'écran est trop petit pour tout dégager — mieux vaut un chevauchement qu'une disparition. Sa profondeur — pour qu'elle se lise au-dessus de la page — vient des molettes du skin (float_shadow_size, float_shadow_lift, float_shadow_alpha ; les skins chanfreinés utilisent float_glow_size).

tour.keep_clear = [header_bar, toolbar]   # des éléments fixes qui ne sont pas des ancres

Les écrans avec souris et clavier

Un doigt n'a pas d'état de survol. Développez pour le mobile seul et deux états propres au bureau restent non vérifiés — et l'un d'eux était cassé : l'anneau de focus de gohud était invisible sur un bouton principal. Le panneau est de la couleur d'accent, et l'anneau l'était aussi : 1.00:1, la même couleur dessinée sur elle-même. En se déplaçant au clavier, impossible de savoir où l'on se trouvait.

La même rangée de boutons dans trois états — normal, survol souris, focus clavier
De haut en bas : normal · survol · focus. Les boutons pleins reçoivent un anneau qui contraste avec leur panneau.

Les boutons pleins (GoPrimaryButton, GoDangerSolidButton) utilisent un anneau qui contraste avec leur propre panneau — sombre sur un thème sombre, blanc sur un thème clair, un crochet de visée sombre en science-fiction. Le vérificateur de contraste mesure l'anneau de focus face au panneau qui le porte : la règle survit donc à un changement de palette (les WCAG 2.4.11 demandent 3:1 sur les indicateurs de focus).

Les widgets du HUD

GoHudAnchor — neuf positions

Il respecte la zone sûre et les marges de bord. Donnez-lui un landscape_spot et il se déplace en paysage — des commandes placées en bas au centre en portrait peuvent passer en bas à droite.

Pourquoi il existe. Écrits à la main pour chaque élément de HUD, les ancres et les décalages dérivent : une barre de vie finit sous la découpe de la caméra sur un appareil à encoche, et un bouton de commande atterrit sur la barre de gestes en paysage. Ce calcul vit en un seul endroit.

Empêcher le contenu de passer sous le HUD

Quand un écran défilant partage l'affichage avec un HUD, le contenu glisse en dessous et les deux textes se superposent jusqu'à ce qu'aucun ne se lise. C'est arrivé deux fois dans cet add-on : le texte indicatif d'un champ de saisie se retrouvait coincé entre les emplacements rapides, et le curseur d'un interrupteur de réglages atterrissait sur la barre de vie.

form.avoid_hud = true                  # reste à l'écart de chaque GoHudAnchor visible
joystick_anchor.reserve_space = false  # …sauf ceux qui n'apparaissent que sous un doigt

Chaque rectangle est contourné dans la direction qui coûte le moins de surface. Une barre en haut à droite est contournée vers le bas sur un téléphone en portrait (13 % de la hauteur) et sur le côté en paysage (21 % de la largeur) — l'éviter verticalement en paysage coûterait 27 % de l'écran. Le terrain déjà cédé est soustrait avant de mesurer le rectangle suivant.

Les éléments de HUD se heurtent aussi entre eux

Les neuf positions découpent l'écran ; elles ne garantissent pas que les éléments s'évitent. Un snackbar large en haut au centre atterrissait en plein sur la barre de vie en haut à droite, masquant la valeur — on ne pouvait pas lire combien de vie il restait.

notice_anchor.avoid_peers = true      # se pose sous le HUD fixe
notice_anchor.reserve_space = false   # et ne pousse pas la page tant qu'il est affiché

Il ne s'écarte que verticalement — se décaler aussi sur le côté ferait apparaître un toast centré à un endroit différent à chaque fois. Et il n'évite que les éléments qui ne s'écartent pas eux-mêmes : si les deux cèdent, ils échangent leurs places sans fin.

GoBar — vie, mana, expérience

var hp := GoBar.new()
hp.label_text = "PV"
hp.ink = GoUi.color(GoTheme.DANGER_FILL)   # le token réservé au remplissage
hp.set_values(320, 500)                     # "320 / 500"

Les variations s'amortissent sur 0,18 s — une barre de vie qui saute ne dit pas la force du coup encaissé. reduce_motion les rend instantanées. Les grands nombres s'abrègent en 12.3k pour que la largeur de la barre ne tressaute pas au gré des chiffres.

GoSlot — un emplacement rapide

Icône, quantité, temps de recharge et raccourci sur une seule face. Accrocher des badges autour d'un petit cercle donne à chaque emplacement une largeur différente et la rangée se met à onduler.

Taille visible et taille tactile diffèrent. Des emplacements serrés ont des boîtes tactiles de 48 dp qui se chevauchent ; le chevauchement revient à l'emplacement dont le centre est le plus proche — faites-les se connaître via touch_peers.

keyboard_focus est désactivé par défaut, pour qu'une rangée de huit emplacements ne s'intercale pas, dans l'ordre de tabulation, entre un utilisateur au clavier et toutes les commandes de réglages. Activez-le quand le clavier ou la manette est la seule entrée.

GoJoystick — le stick virtuel

ModeComportement
FIXEDToujours au même endroit — facile à trouver sans regarder
FOLLOWApparaît là où le pouce se pose
RELATIVEContinue de suivre le pouce après être apparu — confortable pour les longs déplacements

Le Vector2 émis par moved a une longueur de 0 à 1 : vous pouvez le multiplier directement par une vitesse ; il ne varie ni avec la taille de l'écran ni avec le DPI.

GoIconButton — paraît petit, s'appuie grand

Sûr uniquement tant que ses voisins ignorent la saisie. Si la zone élargie recouvre le bouton suivant, ce bouton cesse de répondre. Des boutons d'icône côte à côte réclament touch_peers.