Comment ça marche
Avant de plonger dans les détails de chaque composant, voilà les concepts fondamentaux d'EriAPI. Lis bien cette section — elle te fera gagner beaucoup de temps.
La Fluent API — écrire du code comme une phrase
La Fluent API (ou "API fluide") est un style de code qui ressemble à une phrase en anglais. Au lieu d'écrire une ligne de code pour chaque propriété, tu enchaînes les méthodes avec un point.
Imagine que tu commandes un café : "Je veux un café, grand, chaud, avec du lait et deux sucres." En code, c'est pareil :
// SANS Fluent API (style ancien, moins lisible) :
Button b = new Button(100, 100, 200, 50);
b.setText("Jouer");
b.setColor(Colors.CYAN);
b.setEnabled(true);
b.setCornerRadius(8);
// AVEC Fluent API (style EriAPI, bien plus lisible) :
Button b = new Button(100, 100, 200, 50)
.text("Jouer") // "le texte est Jouer"
.colorScheme(Button.Style.CYAN) // "le style est CYAN"
.enabled(true) // "il est activé"
.cornerRadius(8); // "les coins sont arrondis à 8px"
// C'est la même chose ! Juste plus agréable à lire et à écrire.
Les coordonnées — où placer les composants
Quand tu crées un composant, tu spécifies sa position avec .originalPos(x, y) et sa taille avec .originalSize(largeur, hauteur).
Les coordonnées sont relatives au conteneur parent (comme les div en HTML/CSS).
Un composant avec .originalPos(20, 30) dans un conteneur à .originalPos(100, 200)
sera affiché à la position (120, 230) en design pixels sur l'écran.
Pour les composants ajoutés directement au root (le conteneur racine à position 0,0),
les coordonnées sont de facto absolues sur l'écran.
// Espace de design : 1920x1080
// Un panneau centré de 600x400
ContainerComponent panel = new ContainerComponent()
.originalPos(660, 340) // position absolue (ajouté au root)
.originalSize(600, 400)
.backgroundColor(0xCC1A1A2E)
.cornerRadius(12);
// Ce label est à (20, 20) DANS le panneau
// Position écran finale : (660+20, 340+20) = (680, 360)
panel.add(new Label("Titre")
.originalPos(20, 20)
.originalSize(560, 30)
.color(0xFFFFFFFF)
.scale(2.0f));
// Ce bouton est en bas du panneau
// Position écran finale : (660+200, 340+340) = (860, 680)
panel.add(new Button("Valider")
.originalPos(200, 340)
.originalSize(200, 40)
.onClick(() -> action()));
root.add(panel);
Tu dessines toujours dans un espace de 1920x1080 (ou la taille que tu passes à super()).
EriAPI convertit automatiquement ces coordonnées pour s'adapter à la vraie résolution du joueur
(1280x720, 2560x1440, etc.). Tu n'as rien à faire de spécial.
Grâce aux coordonnées relatives, si tu déplaces un conteneur, tous ses enfants suivent automatiquement.
Tu n'as jamais besoin de recalculer les positions des composants enfants. Pense à ça comme des div imbriquées en HTML.
La hiérarchie de composants
Les composants peuvent contenir d'autres composants. On appelle ça la hiérarchie.
Un ContainerComponent peut contenir des boutons, des labels, d'autres conteneurs...
Quand tu cliques sur l'écran, le framework cherche automatiquement quel composant a reçu le clic.
import fr.eri.eriapi.gui.core.ContainerComponent;
// Créer une "boîte" (conteneur) avec fond et bordure
ContainerComponent panneau = new ContainerComponent(100, 100, 600, 400)
.backgroundColor(Colors.withAlpha(Colors.BLACK, 180)) // Fond noir semi-transparent
.borderColor(Colors.CYAN) // Bordure cyan
.cornerRadius(12); // Coins arrondis
// Ajouter des composants DANS le panneau
panneau.add(new Label(120, 120, 300, 30).text("Dans le panneau"));
panneau.add(new Button(120, 200, 200, 40).text("Bouton dedans"));
// Ajouter le panneau à la GUI (les enfants sont ajoutés automatiquement)
addComponent(panneau);
Le cycle de vie d'une GUI
Quand le joueur ouvre un menu EriAPI, voici ce qui se passe dans l'ordre :
- 1. Instanciation — Java appelle
new MonMenu(), le constructeur s'exécute - 2. initGui() — Le framework appelle
initGui(), tu crées tes composants - 3. drawScreen() — 60 fois par seconde, le framework redessine tous les composants
- 4. Événements — Clics, touches du clavier, scroll de la souris : le framework les distribue automatiquement
- 5. Fermeture — Quand le joueur appuie sur Échap ou que tu appelles
close()
EriGuiScreen
EriGuiScreen est la classe de base de toute interface EriAPI. Chaque menu que tu crées
doit étendre cette classe. C'est elle qui gère automatiquement le scaling, les événements
et le rendu de tous tes composants.
Étends cette classe pour créer un menu. Implémente initGui() pour ajouter tes composants.
-
ConstructeurEriGuiScreen(int designWidth, int designHeight)Constructeur — passe la taille de ton espace de design (ex: 1920, 1080). Le framework gère le scaling automatiquement.
-
À overridevoid initGui()Appelée une fois à l'ouverture du menu. C'est ici que tu crées tes composants avec
addComponent(). Toujours appelersuper.initGui()en premier ! -
Méthodevoid addComponent(Component c)Ajoute un composant à la GUI. Il sera rendu et recevra les événements automatiquement.
-
Méthodevoid close()Ferme le menu (comme si le joueur appuyait sur Échap).
-
Optionnelvoid onClose()Appelée quand le menu se ferme. Tu peux overrider cette méthode pour faire quelque chose à la fermeture.
Integration automatique des ItemSlot
EriGuiScreen gere automatiquement le cycle de vie complet des composants
ItemSlot presents dans l'arbre de composants.
Aucune configuration supplementaire n'est necessaire.
| Evenement EriGuiScreen | Action ItemSlot declenchee |
|---|---|
drawScreen(mouseX, mouseY, pt) |
ItemSlot.renderCursorItem(mouseX, mouseY) apres tous les composants et notifications |
mouseReleased(x, y, btn) |
ItemSlot.onDragEnd() avant la propagation aux composants |
mouseClickMove(x, y, btn, dt) |
slot.checkDragHover(x, y) sur chaque ItemSlot de l'arbre |
onGuiClosed() |
ItemSlot.clearCursor() pour reinitialiser l'etat global |
Les Composants
Un composant est un élément visuel de ton interface : un bouton, un texte, une forme, un champ de saisie... Tous les composants EriAPI partagent les mêmes propriétés de base.
Toutes les propriétés communes à chaque composant. Ces méthodes sont disponibles sur tous les composants.
-
Fluentvisible(boolean visible)Afficher ou cacher le composant. Quand il est caché, il ne reçoit plus les clics non plus.
-
Fluentenabled(boolean enabled)Activer ou désactiver le composant. Un bouton désactivé est grisé et ne répond plus aux clics.
-
Fluenttooltip(String text)Texte affiché au survol de la souris (infobulle).
-
FluentzIndex(int z)Ordre d'affichage. Les composants avec un zIndex plus grand s'affichent par-dessus les autres.
Texture de fond (tous composants)
Tous les composants héritent de ces méthodes de texture. Quand une image de fond est définie, elle remplace le rendu couleur. Si aucune image n'est définie, le comportement classique (couleur) s'applique.
-
FluentbackgroundImage(ResourceLocation image)Image de fond du composant. Remplace la couleur de fond si définie. Fonctionne sur Button, TextField, Panel, ScrollList, ScrollPanel, ContainerComponent, ProgressBar, etc.
-
FluentscaleMode(ScaleMode mode)Mode de redimensionnement de la texture :
STRETCH,FIT,FILL,TILE,NINE_SLICE. -
FluentimageTint(int argb)Teinte ARGB appliquée sur la texture.
0xFFFFFFFF= pas de teinte (défaut). -
FluentnineSliceBorder(int pixels)Taille de la bordure pour le mode
NINE_SLICE(en pixels texture). Les coins sont préservés, les bords étirés. -
FluentimageUV(int u, int v, int uW, int vH, int texW, int texH)Sous-région d'une spritesheet. Permet d'utiliser une seule image contenant plusieurs textures.
ResourceLocation panelTex = new ResourceLocation("monmod", "textures/gui/panel.png");
// Fonctionne sur ScrollPanel, ScrollList, ContainerComponent, Panel...
ScrollPanel panel = new ScrollPanel()
.originalPos(100, 50)
.originalSize(300, 200)
.backgroundColor(Colors.PANEL_BG); // fallback si texture absente
panel.backgroundImage(panelTex);
panel.scaleMode(ScaleMode.NINE_SLICE);
panel.nineSliceBorder(8);
// Fonctionne aussi sur TextField, Button, etc.
TextField tf = new TextField()
.originalPos(100, 260)
.originalSize(200, 20)
.placeholder("Input texture...");
tf.backgroundImage(new ResourceLocation("monmod", "textures/gui/input.png"));
tf.scaleMode(ScaleMode.NINE_SLICE);
tf.nineSliceBorder(4);
Si backgroundImage n'est pas défini, le composant se comporte exactement comme avant (rendu couleur).
Aucun code existant n'est cassé par l'ajout du support texture.
Button
Un Button, c'est comme un bouton dans n'importe quelle application — tu cliques dessus
et il fait quelque chose. C'est le composant que tu utiliseras le plus souvent.
Exemple basique
// new Button(x, y, largeur, hauteur)
Button monBouton = new Button(760, 500, 400, 50)
.text("Cliquer ici !") // Le texte affiché sur le bouton
.colorScheme(Button.Style.CYAN) // Couleur du bouton
.onClick(() -> {
// Ce code s'exécute quand on clique
System.out.println("Cliqué !");
});
addComponent(monBouton);
Les 7 styles disponibles
Le style définit la couleur du bouton. Tu le passes à colorScheme().
| Style | Couleur | Usage typique |
|---|---|---|
| Button.Style.CYAN | #00DDFF | Action principale, confirmation |
| Button.Style.PURPLE | #AA44FF | Action secondaire, option |
| Button.Style.GREEN | #00C864 | Valider, accepter, succès |
| Button.Style.RED | #FF4040 | Supprimer, annuler, danger |
| Button.Style.ORANGE | #FF8800 | Avertissement, modifier |
| Button.Style.GRAY | #606080 | Action neutre, retour |
| Button.Style.WHITE | #E2E2F0 | Action subtile, non-prioritaire |
Toutes les options
-
Fluenttext(String texte)Définit le texte affiché sur le bouton.
-
FluentcolorScheme(Button.Style style)Définit le style de couleur du bouton (voir tableau ci-dessus).
-
Fluentoutlined(boolean outlined)Si true, le bouton est transparent avec seulement une bordure colorée (style "ghost").
-
FluentcornerRadius(int radius)Arrondit les coins du bouton. 0 = carré, 4 = légèrement arrondi, 25 = très arrondi (pill).
-
ÉvénementonClick(Runnable action)Définit ce qui se passe quand on clique. Le code dans
() -> { ... }s'exécute au clic. -
Fluentenabled(boolean actif)Active ou désactive le bouton. Un bouton désactivé est grisé et ne clique plus.
-
Fluentvisible(boolean visible)Affiche ou cache le bouton.
-
FluenttextScale(float scale)Taille du texte du bouton. 1.0 = normal, 0.8 = plus petit, 1.2 = plus grand.
Exemple avancé
// Un bouton "outlined" (contour seulement) rouge pour une action dangereuse
Button boutonSupprimer = new Button(760, 600, 400, 50)
.text("Supprimer mon personnage")
.colorScheme(Button.Style.RED) // Rouge = danger
.outlined(true) // Contour seulement (plus discret)
.cornerRadius(4) // Légèrement arrondi
.enabled(false) // Désactivé au départ
.onClick(() -> {
// Code exécuté au clic
supprimerPersonnage();
});
// Plus tard, pour activer le bouton :
boutonSupprimer.enabled(true);
// Plusieurs boutons en ligne avec des styles différents
Button boutonValider = new Button(760, 700, 185, 45)
.text("Valider")
.colorScheme(Button.Style.GREEN)
.cornerRadius(8)
.onClick(() -> valider());
Button boutonAnnuler = new Button(975, 700, 185, 45)
.text("Annuler")
.colorScheme(Button.Style.GRAY)
.outlined(true)
.cornerRadius(8)
.onClick(() -> this.close());
addComponent(boutonValider);
addComponent(boutonAnnuler);
() -> ...() -> { ... } est une "lambda" Java — c'est du code qu'on passe en paramètre.
Pour du code court, tu peux écrire sans accolades : .onClick(() -> this.close()).
Pour du code plus long, utilise les accolades : .onClick(() -> { ligne1; ligne2; }).
Support Textures (états)
Le Button supporte des textures différentes pour chaque état visuel.
Le backgroundImage hérité de Component sert de texture par défaut (état normal).
hoverImage et pressedImage permettent de changer l'apparence au survol et au clic.
-
FluenthoverImage(ResourceLocation image)Texture affichée quand la souris survole le bouton. Si non définie, utilise
backgroundImage. -
FluentpressedImage(ResourceLocation image)Texture affichée quand le bouton est cliqué/pressé. Si non définie, utilise
hoverImageoubackgroundImage.
ResourceLocation btnNormal = new ResourceLocation("monmod", "textures/gui/btn.png");
ResourceLocation btnHover = new ResourceLocation("monmod", "textures/gui/btn_hover.png");
ResourceLocation btnPressed = new ResourceLocation("monmod", "textures/gui/btn_pressed.png");
Button btn = new Button("Acheter")
.originalPos(100, 200)
.originalSize(200, 40)
.hoverImage(btnHover)
.pressedImage(btnPressed)
.textColor(Colors.WHITE);
btn.backgroundImage(btnNormal);
btn.scaleMode(ScaleMode.NINE_SLICE);
btn.nineSliceBorder(6);
L'ordre de priorité est : pressedImage > hoverImage > backgroundImage.
Si aucune texture n'est définie, le rendu couleur classique s'applique (retrocompatibilité totale).
TexturedButton
Un TexturedButton, c'est comme un Button normal, mais au lieu d'une couleur
unie, il affiche une image (une texture). Parfait pour des boutons avec des icônes
ou un style graphique personnalisé.
import net.minecraft.util.ResourceLocation;
// Un ResourceLocation pointe vers une image dans tes assets
// Le fichier doit être dans : src/main/resources/assets/tonmodid/textures/gui/monbouton.png
ResourceLocation maTexture = new ResourceLocation("tonmodid", "textures/gui/monbouton.png");
TexturedButton boutonTexture = new TexturedButton(760, 500, 64, 64)
.texture(maTexture) // L'image à afficher
.hoverTint(0x4400DDFF) // Teinte bleutée au survol (ARGB, AA=alpha)
.pressedTint(0x88AA44FF) // Teinte violette quand on appuie
.label("Jouer", Colors.WHITE) // Texte optionnel affiché sur le bouton
.onClick(() -> ouvrirMenu());
addComponent(boutonTexture);
-
Fluenttexture(ResourceLocation rl)L'image PNG à utiliser pour le bouton.
-
FluenthoverTint(int argbColor)Teinte de couleur appliquée quand la souris survole le bouton. Format ARGB :
0xAARRGGBB. Utilise un alpha faible (ex:0x44) pour un effet subtil. -
FluentpressedTint(int argbColor)Teinte appliquée quand on appuie sur le bouton (mouse down).
-
Fluentlabel(String text, int color)Texte optionnel affiché par-dessus la texture. Pratique pour les boutons avec icône + libellé.
-
ÉvénementonClick(Runnable action)Code exécuté au clic.
0xAARRGGBB : AA = opacité (00=transparent, FF=opaque), RR = rouge, GG = vert, BB = bleu.
Exemple : 0x8800FF00 = vert semi-transparent. 0xFF0000FF = bleu opaque.
Label
Un Label, c'est simplement du texte affiché à l'écran. C'est le composant de base pour
afficher des titres, des descriptions, des valeurs — n'importe quel texte.
// new Label(x, y, largeur, hauteur)
Label monTexte = new Label(760, 100, 400, 30)
.text("Bienvenue dans mon mod !") // Le texte à afficher
.color(Colors.WHITE) // Couleur du texte
.align(Label.Align.CENTER) // Centrer dans la zone
.scale(1.5f); // Taille (1.0 = normal)
addComponent(monTexte);
-
Fluenttext(String texte)Le texte à afficher. Tu peux le changer après coup avec la même méthode.
-
Fluentcolor(int argbColor)Couleur du texte au format ARGB. Utilise les constantes de la classe
Colors(ex:Colors.WHITE,Colors.CYAN). -
Fluentalign(Label.Align align)Alignement du texte dans la zone.
Label.Align.LEFT(gauche, défaut),CENTER(centré),RIGHT(droite). -
Fluentscale(float scale)Taille du texte. 1.0 = taille normale, 0.8 = plus petit, 2.0 = double taille. Utile pour les titres.
-
Fluentshadow(boolean shadow)Ajoute une ombre portée sous le texte pour le rendre plus lisible sur fond clair.
-
Fluentclip(boolean clip)Si le texte est trop long pour la zone, il est coupé avec "..." à la fin. Utile pour les noms de joueurs longs.
-
FluentscaleToFit(boolean enabled)Si
true, au lieu de tronquer le texte avec "...", reduit automatiquement l'echelle du texte pour qu'il rentre exactement dans la largeur du composant. Mutuellement exclusif avecwrapped()au rendu — si les deux sont actifs,wrappedprend la priorite. -
Fluentwrapped(boolean enabled)Si
true, le texte passe a la ligne suivante aux limites de mots au lieu d'etre tronque. Si le contenu depasse la hauteur du composant, le scroll vertical a la souris est active (clippe par scissor). Mutuellement exclusif avecscaleToFit()—wrappeda la priorite si les deux sont actifs.
Exemple avancé
// Titre principal centré, grand et blanc
Label titre = new Label(0, 60, 1920, 50)
.text("Tableau de Bord")
.color(Colors.WHITE)
.align(Label.Align.CENTER)
.scale(2.0f)
.shadow(true); // Ombre pour le rendre plus visible
// Sous-titre en couleur, centré
Label sousTitre = new Label(0, 120, 1920, 30)
.text("Statistiques du joueur")
.color(0xFF00DDFF) // Cyan en ARGB
.align(Label.Align.CENTER)
.scale(1.2f);
// Texte long avec clip (tronqué si trop long)
Label nomLong = new Label(100, 200, 200, 20)
.text("NomDeJoueurTrèsTrèsTrèsLong")
.color(Colors.GRAY)
.clip(true); // Devient "NomDeJoueurTrès..." si trop long
// Texte long qui s'adapte automatiquement (scaleToFit)
Label nomAdapte = new Label(100, 240, 200, 20)
.text("NomDeJoueurTrèsTrèsTrèsLong")
.color(Colors.GRAY)
.scaleToFit(true); // Réduit la taille pour rentrer dans 200px
// Description multi-ligne avec retour à la ligne (wrapped)
Label description = new Label(100, 280, 400, 100)
.text("Ceci est une longue description qui va automatiquement passer à la ligne quand elle dépasse la largeur du composant. Si le texte dépasse la hauteur, le joueur peut scroller avec la molette.")
.color(Colors.LIGHT_GRAY)
.wrapped(true); // Retour à la ligne automatique
addComponent(titre);
addComponent(sousTitre);
addComponent(nomLong);
addComponent(nomAdapte);
addComponent(description);
// Mettre à jour le texte dynamiquement (en dehors de initGui)
titre.text("Nouveau titre !");
Rectangle
Un Rectangle est une forme rectangulaire que tu peux utiliser comme fond de panneau,
comme séparateur, comme barre de couleur, ou pour créer n'importe quelle structure visuelle.
import fr.eri.eriapi.gui.components.Rectangle;
// Un panneau sombre avec bordure cyan et coins arrondis
Rectangle panneau = new Rectangle(100, 100, 600, 400)
.fillColor(0xCC0D0D1A) // Fond bleu très sombre, 80% opaque
.borderColor(0xFF00DDFF) // Bordure cyan opaque
.borderThickness(2) // Épaisseur de la bordure en pixels
.cornerRadius(12); // Coins arrondis
addComponent(panneau);
// Un simple séparateur horizontal
Rectangle separateur = new Rectangle(100, 260, 600, 2)
.fillColor(0xFF252540); // Gris foncé
addComponent(separateur);
-
FluentfillColor(int argbColor)Couleur de remplissage du rectangle. Utilise
0x00000000pour transparent (pas de fond). -
FluentborderColor(int argbColor)Couleur de la bordure. Si tu ne l'appelles pas, pas de bordure.
-
FluentborderThickness(int pixels)Épaisseur de la bordure en pixels. Par défaut : 1.
-
FluentcornerRadius(int radius)Arrondit les coins. 0 = carré, 4-8 = légèrement arrondi, 16+ = très arrondi.
Circle
Un Circle dessine un cercle. Tu peux l'utiliser pour des avatars ronds, des indicateurs,
des pastilles de couleur, ou n'importe quelle décoration circulaire.
import fr.eri.eriapi.gui.components.Circle;
// Un cercle plein cyan, 80x80 pixels, positionné à (200, 200)
// Pour un cercle, largeur et hauteur doivent être égaux
Circle cercle = new Circle(200, 200, 80, 80)
.fillColor(0xFF00DDFF) // Rempli en cyan
.borderColor(0xFFFFFFFF) // Bordure blanche
.borderThickness(3); // Bordure de 3px
addComponent(cercle);
// Un cercle sans remplissage (juste la bordure)
Circle anneau = new Circle(350, 200, 60, 60)
.fillColor(0x00000000) // Transparent (pas de fond)
.borderColor(0xFFAA44FF) // Bordure violette
.borderThickness(4);
-
FluentfillColor(int argbColor)Couleur de remplissage du cercle.
-
FluentborderColor(int argbColor)Couleur de la bordure du cercle.
-
FluentborderThickness(int pixels)Épaisseur de la bordure en pixels.
Triangle
Un Triangle est une flèche directionnelle. Très utile pour indiquer une direction
(menu précédent/suivant, flèche de défilement, indicateur de sélection).
import fr.eri.eriapi.gui.components.Triangle;
// Flèche vers le haut (comme un "^")
Triangle flecheHaut = new Triangle(200, 200, 30, 20)
.direction(Triangle.Direction.UP)
.fillColor(0xFF00DDFF); // Cyan
// Flèche vers le bas (comme un "v")
Triangle flecheBas = new Triangle(200, 240, 30, 20)
.direction(Triangle.Direction.DOWN)
.fillColor(0xFF00DDFF);
// Flèche vers la gauche
Triangle flecheGauche = new Triangle(160, 215, 20, 30)
.direction(Triangle.Direction.LEFT)
.fillColor(0xFFAA44FF); // Violet
// Flèche vers la droite
Triangle flecheDroite = new Triangle(250, 215, 20, 30)
.direction(Triangle.Direction.RIGHT)
.fillColor(0xFFAA44FF);
addComponent(flecheHaut);
addComponent(flecheBas);
addComponent(flecheGauche);
addComponent(flecheDroite);
-
Fluentdirection(Triangle.Direction dir)Direction de la pointe. Valeurs :
UP,DOWN,LEFT,RIGHT. -
FluentfillColor(int argbColor)Couleur de remplissage du triangle.
TextField
Un TextField est une zone de texte dans laquelle le joueur peut taper du texte avec son clavier.
Parfait pour les formulaires de connexion, les pseudos, les recherches, les messages.
import fr.eri.eriapi.gui.components.TextField;
// new TextField(x, y, largeur, hauteur)
TextField champNom = new TextField(760, 400, 400, 40)
.placeholder("Entre ton pseudo...") // Texte affiché quand vide
.maxLength(20) // Maximum 20 caractères
.onTextChanged(text -> {
// Appelé à chaque fois que le texte change (chaque touche)
System.out.println("Texte actuel : " + text);
});
addComponent(champNom);
// Récupérer le texte entré par le joueur (dans onClick d'un bouton par exemple) :
Button boutonValider = new Button(760, 460, 400, 45)
.text("Valider")
.colorScheme(Button.Style.GREEN)
.onClick(() -> {
String texteEntré = champNom.getText(); // Récupère le texte
System.out.println("Le joueur a entré : " + texteEntré);
});
addComponent(boutonValider);
-
Fluentplaceholder(String texte)Texte grisé affiché quand le champ est vide. Disparaît quand le joueur commence à taper.
-
FluentmaxLength(int max)Nombre maximum de caractères que le joueur peut taper.
-
ÉvénementonTextChanged(Consumer<String> callback)Code exécuté à chaque modification du texte. Reçoit le nouveau texte en paramètre.
-
GettergetText()Retourne le texte actuellement dans le champ.
-
FluentsetText(String texte)Remplace le contenu du champ par ce texte (utile pour pré-remplir).
-
Fluentfocus(boolean focus)Donner ou retirer le focus au champ. Quand un champ a le focus, le clavier tape dedans.
Le TextField gère automatiquement : Ctrl+C (copier),
Ctrl+V (coller), Ctrl+X (couper), Ctrl+A
(tout sélectionner), Origine/Fin (début/fin de ligne). Tu n'as rien à coder.
NumericField
Un NumericField est un champ de texte spécialisé pour les nombres.
Il bloque automatiquement les caractères non-numériques et peut limiter les valeurs min/max.
Parfait pour saisir des niveaux d'expérience, des quantités, des prix.
import fr.eri.eriapi.gui.components.NumericField;
// Champ pour saisir un niveau entre 1 et 100 (entiers uniquement)
NumericField champNiveau = new NumericField(760, 400, 300, 40)
.placeholder("Niveau (1-100)")
.min(1) // Valeur minimum autorisée
.max(100) // Valeur maximum autorisée
.decimal(false) // false = entiers seulement, true = autorise les décimales
.negative(false) // false = nombres positifs seulement
.onTextChanged(text -> System.out.println("Valeur : " + text));
addComponent(champNiveau);
// Récupérer la valeur saisie
Button bouton = new Button(760, 460, 300, 45)
.text("Appliquer")
.colorScheme(Button.Style.CYAN)
.onClick(() -> {
double valeur = champNiveau.getValue(); // Récupère la valeur numérique
int niveau = (int) valeur;
System.out.println("Niveau sélectionné : " + niveau);
});
// Champ pour un prix avec décimales (ex: 9.99)
NumericField champPrix = new NumericField(760, 520, 300, 40)
.placeholder("Prix (ex: 9.99)")
.min(0.01)
.max(9999.99)
.decimal(true); // Autorise les nombres décimaux (9.99, 14.50, etc.)
-
Fluentmin(double valeurMin)Valeur minimale autorisée. Le champ refuse les valeurs inférieures.
-
Fluentmax(double valeurMax)Valeur maximale autorisée.
-
Fluentdecimal(boolean autorisé)Si true, le joueur peut entrer des nombres décimaux (avec une virgule ou un point).
-
Fluentnegative(boolean autorisé)Si true, le joueur peut entrer des nombres négatifs.
-
GettergetValue()Retourne la valeur numérique saisie sous forme de
double. Retourne 0.0 si le champ est vide.
PasswordField
Un PasswordField est un champ de texte où les caractères sont remplacés par des
points ou des étoiles. Idéal pour les écrans de connexion et les systèmes d'authentification.
import fr.eri.eriapi.gui.components.PasswordField;
// Un champ mot de passe avec points comme masque
PasswordField champMdp = new PasswordField(760, 450, 400, 40)
.placeholder("Mot de passe")
.maxLength(32) // Maximum 32 caractères
.bulletChar('*'); // Caractère utilisé comme masque (* par défaut, aussi: •, ●)
addComponent(champMdp);
// Bouton pour révéler/masquer le mot de passe (comme l'icône oeil)
Button boutonReveal = new Button(1175, 450, 45, 40)
.text("voir")
.colorScheme(Button.Style.GRAY)
.outlined(true)
.onClick(() -> {
// toggleReveal() bascule entre masqué et visible
champMdp.toggleReveal();
});
addComponent(boutonReveal);
// Récupérer le vrai mot de passe (pas les étoiles)
Button boutonConnexion = new Button(760, 510, 400, 45)
.text("Se connecter")
.colorScheme(Button.Style.CYAN)
.onClick(() -> {
String vraiMotDePasse = champMdp.getText();
// Utilise vraiMotDePasse pour l'authentification
});
addComponent(boutonConnexion);
-
FluentbulletChar(char caractère)Le caractère utilisé pour masquer les lettres. Par défaut :
*. Tu peux utiliser'•'ou'●'pour un rendu plus moderne. -
MéthodetoggleReveal()Bascule entre "mot de passe visible" et "mot de passe masqué". Appelle deux fois pour revenir à l'état initial.
-
GettergetText()Retourne le vrai texte entré par le joueur (pas les étoiles).
MultiLineField
Un champ de saisie multi-lignes avec scroll vertical, numéros de ligne optionnels et sélection multi-ligne complète. Idéal pour les consoles, éditeurs de code, ou zones de texte longues.
2
3
4
System.out.println(
"Hello EriAPI!"
);
MultiLineField editor = new MultiLineField()
.originalPos(50, 50)
.originalSize(300, 150)
.placeholder("Entrez votre code ici...")
.showLineNumbers(true)
.maxLines(100)
.tabSize(4)
.onTextChanged(text -> System.out.println("Texte modifié"));
Fonctionnalités clavier
| Raccourci | Action |
|---|---|
Enter | Nouvelle ligne |
Backspace (col 0) | Fusionne avec la ligne précédente |
Delete (fin de ligne) | Fusionne avec la ligne suivante |
↑ / ↓ | Navigation verticale (mémoire de colonne) |
Home / End | Début / fin de ligne |
Ctrl+Home / End | Début / fin du document |
Shift+flèches | Sélection multi-ligne |
Ctrl+A / C / V / X | Tout sélectionner / Copier / Coller / Couper |
Tab | Insère des espaces (configurable via tabSize) |
Fluent API
| Méthode | Description |
|---|---|
.placeholder(String) | Texte affiché quand le champ est vide |
.maxLength(int) | Nombre max de caractères total |
.maxLines(int) | Nombre max de lignes (0 = illimité) |
.showLineNumbers(boolean) | Afficher les numéros de ligne |
.tabSize(int) | Nombre d'espaces pour Tab (défaut: 4) |
.lineHeight(int) | Hauteur d'une ligne en pixels |
.scrollSpeed(int) | Vitesse du scroll vertical |
.onTextChanged(Consumer<String>) | Callback lors de la modification du texte |
.backgroundColor(int) | Couleur de fond |
.textColor(int) | Couleur du texte |
.cursorColor(int) | Couleur du curseur |
.selectionColor(int) | Couleur de la sélection |
.lineNumberColor(int) | Couleur des numéros de ligne |
Méthodes utiles
| Méthode | Description |
|---|---|
getText() | Retourne tout le texte (lignes jointes par \n) |
setText(String) | Remplace tout le texte |
getLineCount() | Nombre de lignes actuel |
isFocused() | Si le champ a le focus |
AutoCompleteField
Un champ de saisie avec suggestions auto-complétées affichées dans un dropdown.
Hérite de TextField — même comportement d'édition, avec un dropdown de suggestions en plus.
AutoCompleteField field = new AutoCompleteField()
.originalPos(100, 50)
.originalSize(200, 16)
.placeholder("Commande...")
.suggestions("help", "give", "gamemode", "gamerule", "tp", "time")
.onSuggestionAccepted(s -> System.out.println("Accepté: " + s));
AutoCompleteField field = new AutoCompleteField()
.originalPos(100, 50)
.originalSize(200, 16)
.placeholder("Rechercher un joueur...")
.suggestionSupplier(query -> {
// Recherche dynamique selon le texte tapé
return playerList.stream()
.filter(p -> p.toLowerCase().startsWith(query.toLowerCase()))
.collect(Collectors.toList());
})
.maxSuggestions(6)
.filterContains(true);
Navigation dans le dropdown
| Raccourci | Action |
|---|---|
↑ / ↓ | Naviguer dans les suggestions |
Enter | Accepter la suggestion sélectionnée |
Tab | Accepter la suggestion (ou la seule suggestion restante) |
Escape | Fermer le dropdown (garder le focus) |
Fluent API
| Méthode | Description |
|---|---|
.suggestions(String...) | Liste statique de suggestions |
.suggestions(List<String>) | Liste statique de suggestions |
.suggestionSupplier(Function<String, List<String>>) | Fournisseur dynamique de suggestions |
.maxSuggestions(int) | Nombre max de suggestions affichées (défaut: 8) |
.caseSensitive(boolean) | Filtrage sensible à la casse (défaut: false) |
.filterContains(boolean) | true = contains, false = startsWith (défaut) |
.onSuggestionAccepted(Consumer<String>) | Callback quand une suggestion est acceptée |
.dropdownBackground(int) | Couleur de fond du dropdown |
.dropdownBorder(int) | Couleur de bordure du dropdown |
.dropdownHoverColor(int) | Couleur du survol dans le dropdown |
.dropdownTextColor(int) | Couleur du texte dans le dropdown |
.dropdownItemHeight(int) | Hauteur d'un item dans le dropdown |
RenderUtil.pauseScissor() pour se dessiner
par-dessus les conteneurs parents (ScrollPanel, etc.), garantissant sa visibilité même dans des layouts complexes.
GridLayout
Un GridLayout organise automatiquement ses composants enfants en grille.
Tu ajoutes des composants et le layout les place en lignes et colonnes tout seul.
Parfait pour des grilles d'objets, des menus avec des options en rangées.
import fr.eri.eriapi.gui.components.GridLayout;
// Une grille de 3 colonnes dans un espace de 600x400
GridLayout grille = new GridLayout(160, 100, 600, 400)
.columns(3) // 3 colonnes
.spacing(10) // 10px entre chaque cellule (horizontal ET vertical)
.padding(16); // 16px de marge intérieure tout autour
// Ajouter des boutons — ils se placent automatiquement dans la grille
// Bouton 1 : colonne 1, ligne 1
grille.add(new Button(0, 0, 180, 50)
.text("Option 1").colorScheme(Button.Style.CYAN));
// Bouton 2 : colonne 2, ligne 1
grille.add(new Button(0, 0, 180, 50)
.text("Option 2").colorScheme(Button.Style.PURPLE));
// Bouton 3 : colonne 3, ligne 1
grille.add(new Button(0, 0, 180, 50)
.text("Option 3").colorScheme(Button.Style.GREEN));
// Bouton 4 : colonne 1, ligne 2 (passe automatiquement à la ligne suivante)
grille.add(new Button(0, 0, 180, 50)
.text("Option 4").colorScheme(Button.Style.ORANGE));
// Le x,y dans new Button(0, 0, ...) n'est pas important :
// la grille calcule les positions automatiquement !
addComponent(grille);
-
Fluentcolumns(int nbColonnes)Nombre de colonnes dans la grille. Les composants passent automatiquement à la ligne suivante quand la colonne est pleine.
-
Fluentrows(int nbLignes)Optionnel : limite le nombre de lignes (les composants supplémentaires ne sont pas affichés).
-
Fluentspacing(int pixels)Espace en pixels entre chaque cellule de la grille (horizontal et vertical).
-
Fluentpadding(int pixels)Marge intérieure entre le bord de la grille et les composants.
-
Méthodeadd(Component composant)Ajoute un composant à la grille. Il sera automatiquement positionné dans la prochaine cellule disponible.
ScrollList
Une ScrollList affiche une liste d'éléments avec une barre de défilement.
Parfaite pour les classements, les listes de joueurs, les historiques, les sélecteurs d'options.
La liste supporte la recherche intégrée.
import fr.eri.eriapi.gui.components.ScrollList;
import fr.eri.eriapi.gui.components.ListItem;
// Une liste scrollable verticale
ScrollList maListe = new ScrollList(100, 100, 400, 500)
.itemHeight(40) // Hauteur de chaque élément en pixels
.scrollbarVisible(true) // Afficher la barre de scroll
.searchEnabled(true); // Activer une barre de recherche en haut
// Ajouter des éléments (voir la classe ListItem plus bas)
maListe.addItem(new MonItem("joueur1", "Joueur Un", 1500));
maListe.addItem(new MonItem("joueur2", "Joueur Deux", 1200));
maListe.addItem(new MonItem("joueur3", "Joueur Trois", 980));
// ... tu peux en ajouter autant que tu veux, la liste scrolle automatiquement
// Vider la liste et la remplir à nouveau (pour mise à jour)
maListe.clearItems();
// Puis addItem() de nouveau...
addComponent(maListe);
-
FluentitemHeight(int pixels)Hauteur de chaque ligne de la liste en pixels.
-
FluentscrollbarVisible(boolean visible)Afficher ou cacher la barre de défilement verticale.
-
FluentsearchEnabled(boolean actif)Affiche un champ de recherche en haut de la liste. Le filtrage des éléments est automatique.
-
MéthodeaddItem(ListItem item)Ajoute un élément à la liste. Les éléments sont affichés dans l'ordre d'ajout.
-
MéthodeclearItems()Supprime tous les éléments de la liste. Utile pour rafraîchir le contenu.
Support texture
Le fond de la liste utilise le backgroundImage hérité de Component.
Les items et la poignée de la scrollbar peuvent recevoir leurs propres textures.
-
FluentitemBackgroundImage(ResourceLocation texture)Texture de fond de chaque item (état normal). Remplace
itemBackgroundColorquand définie. -
FluentitemHoverImage(ResourceLocation texture)Texture de fond au survol. Si non définie, utilise
itemBackgroundImage. -
FluentitemSelectedImage(ResourceLocation texture)Texture de fond de l'item sélectionné. Si non définie, utilise
itemBackgroundImage. -
FluentitemImageScaleMode(ScaleMode mode)Mode d'étirement de la texture des items.
-
FluentitemImageTint(int argb)Teinte ARGB sur la texture des items.
-
FluentitemSliceBorder(int pixels)Bordure 9-slice pour la texture des items (si
itemImageScaleModeestNINE_SLICE). -
FluentthumbImage(ResourceLocation texture)Texture de la poignée de la barre de défilement.
-
FluentthumbScaleMode(ScaleMode mode)Mode d'étirement de la texture de la poignée.
-
FluentthumbImageTint(int argb)Teinte ARGB sur la texture de la poignée.
ListItem
ListItem est la classe abstraite que tu dois étendre pour créer les éléments d'une ScrollList.
C'est une classe "abstraite" — ça veut dire qu'elle donne la structure, et c'est à toi de définir
comment chaque élément s'affiche.
import fr.eri.eriapi.gui.components.ListItem;
import fr.eri.eriapi.gui.util.Colors;
import fr.eri.eriapi.gui.util.RenderUtil;
// Créer une classe pour les joueurs dans un classement
// Elle étend ListItem — c'est obligatoire
public class ItemJoueur extends ListItem {
// Les données de cet élément
private String nomJoueur;
private int score;
private int rang;
// Constructeur : initialise les données
// "id" est un identifiant unique pour cet élément (pour la recherche)
// "displayName" est le texte utilisé pour la recherche
public ItemJoueur(String id, String nomJoueur, int score, int rang) {
super(id, nomJoueur); // id + nom affiché (utilisé pour filtrer)
this.nomJoueur = nomJoueur;
this.score = score;
this.rang = rang;
}
// render() est appelée pour dessiner cet élément dans la liste
// x, y = position du coin supérieur gauche de l'élément
// width, height = taille disponible
// mouseX, mouseY = position de la souris (pour les effets hover)
@Override
public void render(int x, int y, int width, int height, int mouseX, int mouseY) {
// Fond légèrement coloré au survol
boolean hover = mouseX >= x && mouseX <= x + width
&& mouseY >= y && mouseY <= y + height;
if (hover) {
RenderUtil.drawRect(x, y, width, height, 0x1500DDFF);
}
// Numéro de rang à gauche
RenderUtil.drawText("#" + rang, x + 10, y + 12, Colors.CYAN, true);
// Nom du joueur
RenderUtil.drawText(nomJoueur, x + 50, y + 12, Colors.WHITE, false);
// Score à droite
String scoreStr = score + " pts";
RenderUtil.drawText(scoreStr, x + width - 80, y + 12, Colors.YELLOW, false);
}
// getSearchText() retourne le texte utilisé pour la recherche
// Ici : on recherche par nom de joueur
@Override
public String getSearchText() {
return nomJoueur;
}
}
// Utilisation dans initGui() :
// ScrollList classement = new ScrollList(100, 100, 500, 400).itemHeight(40);
// classement.addItem(new ItemJoueur("uuid1", "Notch", 5000, 1));
// classement.addItem(new ItemJoueur("uuid2", "Dinnerbone", 4200, 2));
// addComponent(classement);
-
À implémentervoid render(int x, int y, int width, int height, int mouseX, int mouseY)À overrider — dessine cet élément. Utilise
RenderUtilpour dessiner du texte, des rectangles, etc. -
À implémenterString getSearchText()À overrider — retourne le texte utilisé pour la recherche. Généralement le nom ou l'identifiant de l'élément.
-
GetterString getId()Retourne l'identifiant unique passé au constructeur.
ListRenderContext
ListRenderContext est un helper de rendu pour les ListItem. Il
encapsule les coordonnees de la ligne (x, y, width, height) et la position de la souris,
et fournit des methodes pretes a l'emploi pour dessiner du texte design-scaled, des icones
d'items Minecraft, et calculer des dimensions proportionnelles a la taille de la ligne.
Sans ce helper, dessiner du texte centre verticalement dans une ligne dont la hauteur change
avec la fenetre devient vite penible. Avec ListRenderContext, tu travailles en
permil (1/1000) de la hauteur de la ligne — le rendu reste correct a toutes les
resolutions.
import fr.eri.eriapi.gui.components.ListItem;
import fr.eri.eriapi.gui.components.ListRenderContext;
public class RecipeItem extends ListItem {
private final ItemStack icon;
private final String name, cost, status;
public RecipeItem(String id, ItemStack icon, String name, String cost, String status) {
super(id, name);
this.icon = icon; this.name = name; this.cost = cost; this.status = status;
}
@Override
public void render(int x, int y, int width, int height, int mouseX, int mouseY, float pt) {
ListRenderContext ctx = ListRenderContext.of(x, y, width, height, mouseX, mouseY);
int gap = ctx.gap();
// Icone a gauche, taille auto-proportionnelle
int iconSize = ctx.drawItem(icon, gap * 2, 0);
int textX = gap * 2 + iconSize + gap;
// Statut a droite
int statusW = ctx.textWidth(status);
int statusOffsetX = width - gap * 2 - statusW;
int textMaxW = statusOffsetX - textX - gap;
// Texte avec offset PROPORTIONNEL a la hauteur (drawTextProp)
ctx.drawTextProp(name, textX, -150, textMaxW, 0xFFFFFFFF);
ctx.drawTextProp(cost, textX, +150, textMaxW, 0xFF4ADE80);
ctx.drawTextProp(status, statusOffsetX, -150, statusW + gap, 0xFFBB55FF);
}
@Override public String getSearchText() { return name; }
}
Champs publics
-
Champfinal int x, y, width, heightPosition et dimensions de la ligne en pixels ecran.
-
Champfinal int mouseX, mouseYPosition de la souris en pixels ecran.
Construction
-
Statiquestatic ListRenderContext of(int x, int y, int width, int height, int mouseX, int mouseY)Cree un contexte a partir des parametres de
ListItem.render().
Tailles proportionnelles
-
Methodeint propW(int permil)Retourne une largeur proportionnelle a la largeur de la ligne (permil = millieme : 1000 = pleine largeur). Minimum 1 pixel.
-
Methodeint propH(int permil)Retourne une hauteur proportionnelle a la hauteur de la ligne. Minimum 1 pixel.
-
Methodeint gap()Espacement standard proportionnel a la largeur de la ligne (minimum 2 pixels).
Positionnement
-
Methodeint midY()Y central de la ligne (
y + height / 2). -
Methodeint centerY(int elementHeight)Y pour centrer verticalement un element de la hauteur donnee.
-
Methodeint rightX(int offset)X depuis le bord droit, decale de
offsetpixels ecran (x + width - offset). -
Methodeboolean isHover(int rx, int ry, int rw, int rh)Verifie si la souris est dans le rectangle donne (pixels ecran).
Dessin
-
Methodeint drawItem(ItemStack stack, int offsetX, int offsetY)Dessine une icone d'item Minecraft. Taille proportionnelle a la hauteur de la ligne (
height - 6px). SioffsetY = 0, l'icone est centree verticalement. Retourne la taille de l'icone en pixels ecran. -
Methodevoid drawText(String text, int offsetX, int offsetY, int maxWidth, int color)Dessine du texte design-scaled.
offsetYest en pixels ecran bruts depuis le centre vertical de la ligne. SimaxWidth > 0, le texte est tronque pour rentrer. -
Methodevoid drawTextProp(String text, int offsetX, int offsetYPermil, int maxWidth, int color) v1.6.1Variante de
drawTextou l'offset vertical est en permil de la hauteur de la ligne (1/1000). Indispensable pour des layouts qui restent corrects a toutes les tailles de fenetre. Exemple :offsetYPermil = -150place le texte a 15% au-dessus du centre,+150a 15% en dessous. -
Methodevoid drawRect(int rx, int ry, int rw, int rh, int color)Dessine un rectangle plein (badges, boutons internes a la ligne).
-
Methodevoid drawCenteredText(String text, int rx, int ry, int rw, int rh, int color)Dessine du texte centre dans un rectangle.
Mesure
-
Methodeint textWidth(String text)Largeur du texte en pixels ecran (design-scaled).
-
Methodeint textHeight()Hauteur d'une ligne de texte en pixels ecran (design-scaled).
ScrollPanel
Un ScrollPanel est un conteneur scrollable dans lequel tu peux mettre n'importe quel
composant EriAPI (boutons, labels, images...). Contrairement à ScrollList qui est faite
pour des listes d'éléments identiques, le ScrollPanel accepte n'importe quelle combinaison
de composants.
import fr.eri.eriapi.gui.components.ScrollPanel;
// Un panneau de 600x400 pixels avec contenu interne de 600x1200 (plus grand = scrollable)
ScrollPanel panneau = new ScrollPanel(160, 100, 600, 400)
.contentHeight(1200) // Hauteur totale du contenu (plus grande que le panneau = scroll)
.scrollbarVisible(true);
// Ajouter des composants DANS le panneau
// Leurs coordonnées sont relatives au panneau (0,0 = coin supérieur gauche du panneau)
panneau.add(new Label(20, 20, 560, 30)
.text("Section 1 : Paramètres généraux")
.color(Colors.CYAN).scale(1.3f));
panneau.add(new TextField(20, 70, 560, 40)
.placeholder("Nom du serveur"));
panneau.add(new Label(20, 140, 560, 30)
.text("Section 2 : Options avancées")
.color(Colors.CYAN).scale(1.3f));
// Encore plus de composants... le panneau scroll automatiquement
addComponent(panneau);
-
FluentcontentHeight(int pixels)Hauteur totale du contenu interne. Si plus grande que la hauteur du panneau, une barre de scroll apparaît.
-
FluentcontentWidth(int pixels)Largeur totale du contenu interne (pour le scroll horizontal).
-
FluentscrollbarVisible(boolean visible)Afficher ou cacher la barre de défilement.
-
Méthodeadd(Component composant)Ajoute un composant dans le panneau. Les coordonnées sont relatives au panneau.
Support texture
Le fond du panneau utilise le backgroundImage hérité de Component.
La poignée de la scrollbar peut recevoir sa propre texture.
-
FluentthumbImage(ResourceLocation texture)Texture de la poignée de la barre de défilement du panneau.
-
FluentthumbScaleMode(ScaleMode mode)Mode d'étirement de la texture de la poignée.
-
FluentthumbImageTint(int argb)Teinte ARGB sur la texture de la poignée.
TabView
Un TabView c'est comme les onglets dans ton navigateur — tu cliques sur un onglet en haut
et le contenu en dessous change. C'est idéal pour organiser plusieurs écrans dans un seul GUI sans
multiplier les fenêtres.
Le TabView est composé de trois éléments qui travaillent ensemble :
- Tab — Un simple conteneur de données (titre + contenu + état actif).
- Panel — Un
ContainerComponentprêt à l'emploi pour regrouper les composants d'un onglet. - TabView — Le composant principal qui affiche les headers en haut et le contenu actif en dessous.
Classe de données légère. Tu ne l'instancies généralement pas directement — c'est TabView.addTab() qui la crée pour toi en coulisses.
-
ConstructeurTab(String title, ContainerComponent content)Crée un onglet avec un titre et un composant conteneur comme contenu.
-
GetterisActive()Retourne
truesi cet onglet est actuellement sélectionné.
Sous-classe de ContainerComponent pensée pour servir de contenu à un onglet. Tu y ajoutes
tes composants avec .add() — leurs coordonnées sont relatives au TabView.
-
Fluentadd(Component composant)Ajoute un composant dans ce panneau. Retourne
thispour le chaînage.
import fr.eri.eriapi.gui.components.TabView;
import fr.eri.eriapi.gui.components.Panel;
import fr.eri.eriapi.gui.components.Label;
import fr.eri.eriapi.gui.components.ProgressBar;
// Crée le contenu de chaque onglet dans un Panel séparé
Panel inventaire = new Panel()
.add(new Label("Mes items").originalPos(110, 90).originalSize(200, 14));
Panel stats = new Panel()
.add(new ProgressBar().originalPos(110, 90).originalSize(200, 14).progress(0.7f));
// Assemble le TabView
TabView tabs = new TabView()
.originalPos(100, 50)
.originalSize(300, 200)
.addTab("Inventaire", inventaire)
.addTab("Stats", stats)
.selected(0) // Ouvre l'onglet 0 au démarrage
.onTabChange(index -> System.out.println("Tab " + index));
addComponent(tabs);
-
FluentaddTab(String title, ContainerComponent content)Ajoute un onglet avec son titre affiché dans le header et son contenu à afficher quand l'onglet est actif.
-
Fluentselected(int index)Sélectionne l'onglet à l'index donné (commence à 0). Utilisé pour définir l'onglet ouvert au démarrage.
-
FluentselectByTitle(String title)Sélectionne l'onglet dont le titre correspond exactement à la chaîne passée. Pratique pour naviguer sans connaître l'index.
-
FluentonTabChange(Consumer<Integer> callback)Définit un callback déclenché à chaque fois que l'utilisateur change d'onglet. Reçoit l'index du nouvel onglet actif.
-
GettergetSelectedIndex()Retourne l'index de l'onglet actuellement actif.
-
GettergetSelectedTitle()Retourne le titre de l'onglet actuellement actif.
-
FluenttabHeight(int h)Hauteur en pixels des headers d'onglets (la barre du haut). Par défaut : 20px.
-
FluenttabBgColor(int couleur)Couleur de fond des headers inactifs au format
0xAARRGGBB. -
FluentactiveTabBgColor(int couleur)Couleur de fond du header de l'onglet actif.
-
FluenttabTextColor(int couleur)Couleur du texte dans les headers inactifs.
-
FluentactiveTabTextColor(int couleur)Couleur du texte dans le header de l'onglet actif.
-
FluenthighlightColor(int couleur)Couleur de la barre d'accentuation tracée sous le header actif pour indiquer visuellement la sélection.
-
FluentcontentBgColor(int couleur)Couleur de fond de la zone de contenu (sous les headers).
-
FluentcontentBorderColor(int couleur)Couleur de la bordure autour de la zone de contenu.
Support texture
Les onglets inactifs, l'onglet actif et la zone de contenu peuvent chacun afficher une texture, indépendamment des couleurs de fond.
-
FluenttabImage(ResourceLocation texture)Texture des headers d'onglets inactifs.
-
FluentactiveTabImage(ResourceLocation texture)Texture du header de l'onglet actuellement actif.
-
FluentcontentImage(ResourceLocation texture)Texture de la zone de contenu (la zone en dessous des headers).
-
FluenttabImageScaleMode(ScaleMode mode)Mode d'étirement pour les textures d'onglets (actif et inactif).
-
FluentcontentImageScaleMode(ScaleMode mode)Mode d'étirement pour la texture de contenu.
-
FluenttabImageTint(int argb)Teinte ARGB sur les textures d'onglets.
-
FluentcontentImageTint(int argb)Teinte ARGB sur la texture de contenu.
-
FluentcontentSliceBorder(int pixels)Taille des coins pour le mode
NINE_SLICEsur la texture de contenu.
ProgressBar
Une ProgressBar affiche une barre de progression — comme les barres de vie ou d'expérience
dans Minecraft, mais personnalisable. Tu lui passes une valeur entre 0.0 et 1.0 et elle fait le reste.
import fr.eri.eriapi.gui.components.ProgressBar;
// Une barre de vie : de 0.0 (vide) à 1.0 (plein)
ProgressBar barreVie = new ProgressBar(100, 100, 400, 20)
.progress(0.75f) // 75% rempli
.fillColor(0xFF00C864) // Vert = vie
.backgroundColor(0xFF252540) // Fond gris foncé
.cornerRadius(10) // Coins arrondis (aspect pill)
.animated(true) // Transition fluide quand la valeur change
.showPercentage(true); // Afficher "75%" au-dessus de la barre
addComponent(barreVie);
// Mettre à jour la progression plus tard (par exemple dans drawScreen ou un callback) :
barreVie.progress(0.5f); // Passer à 50%
// Une barre d'expérience bleue sans pourcentage
ProgressBar barreXP = new ProgressBar(100, 140, 400, 12)
.progress(0.3f)
.fillColor(0xFF00DDFF)
.cornerRadius(6)
.animated(true);
-
Fluentprogress(float valeur)Valeur entre 0.0 (vide) et 1.0 (plein). 0.5 = 50%, 0.75 = 75%, etc. Tu peux appeler cette méthode à tout moment pour mettre à jour la barre.
-
FluentfillColor(int argbColor)Couleur de la partie remplie de la barre.
-
FluentbackgroundColor(int argbColor)Couleur du fond (partie vide) de la barre.
-
FluentcornerRadius(int radius)Arrondit les coins de la barre. Un grand radius par rapport à la hauteur donne un aspect "pill".
-
Fluentanimated(boolean animé)Si true, la barre se déplace de façon fluide quand la valeur change (interpolation).
-
FluentshowPercentage(boolean afficher)Affiche le pourcentage en texte au-dessus de la barre (ex: "75%").
-
GettergetProgress()Retourne la valeur actuelle (entre 0.0 et 1.0).
Support texture
En plus des couleurs plates, tu peux habiller la barre avec des textures. La texture de
remplissage (fillImage) est clippée par scissor pour suivre exactement la
progression. Le backgroundImage hérité de Component s'applique
au fond de la barre.
ProgressBar bar = new ProgressBar()
.originalPos(100, 50)
.originalSize(200, 16)
.progress(0.7f)
.fillImage(new ResourceLocation("monmod", "textures/gui/fill.png"))
.fillScaleMode(ScaleMode.NINE_SLICE)
.fillSliceBorder(4);
// Image de fond (hérité de Component)
bar.backgroundImage(new ResourceLocation("monmod", "textures/gui/bar_bg.png"));
-
FluentfillImage(ResourceLocation texture)Texture de la partie remplie. Clippée via scissor pour correspondre au niveau de progression.
-
FluentfillScaleMode(ScaleMode mode)Mode d'étirement de la texture de remplissage :
STRETCH,NINE_SLICE,TILEouFIT. -
FluentfillImageTint(int argb)Teinte ARGB appliquée par-dessus la texture de remplissage. Par défaut
0xFFFFFFFF(aucune teinte). -
FluentfillSliceBorder(int pixels)Taille des coins en pixels pour le mode
NINE_SLICE.
Slider
Un Slider est une glissière que le joueur peut déplacer avec la souris pour choisir
une valeur dans une plage. Idéal pour le volume, la luminosité, la vitesse, ou n'importe quel
paramètre numérique à ajuster de façon intuitive.
import fr.eri.eriapi.gui.components.Slider;
// Un slider de volume : de 0 à 100, par pas de 1
Slider sliderVolume = new Slider(100, 200, 400, 20)
.range(0, 100) // Valeur minimum et maximum
.value(75) // Valeur initiale (75 = 75%)
.step(1) // Granularité des pas (1 = entiers, 0.5 = demi-valeurs)
.showValue(true) // Afficher la valeur actuelle à côté du slider
.onValueChange(val -> {
// Appelé chaque fois que le joueur déplace le slider
int volume = (int) val;
System.out.println("Volume : " + volume + "%");
});
addComponent(sliderVolume);
// Un slider de 0.0 à 1.0 pour la transparence (avec décimales)
Slider sliderAlpha = new Slider(100, 250, 400, 20)
.range(0.0, 1.0)
.value(0.8)
.step(0.05) // Par pas de 0.05
.showValue(true)
.onValueChange(val -> setAlpha((float) val));
// Lire la valeur actuelle depuis un bouton :
Button btnApply = new Button(100, 290, 200, 40)
.text("Appliquer")
.colorScheme(Button.Style.CYAN)
.onClick(() -> {
double val = sliderVolume.getValue();
appliquerVolume((int) val);
});
-
Fluentrange(double min, double max)Définit la plage de valeurs.
range(0, 100)pour 0 à 100,range(0.0, 1.0)pour 0 à 1. -
Fluentvalue(double valeur)Valeur initiale du slider. Doit être dans la plage définie par
range(). -
Fluentstep(double pas)Granularité du slider.
1= entiers,0.5= demi-valeurs,0.1= dixièmes. -
FluentshowValue(boolean afficher)Affiche la valeur actuelle à côté du curseur.
-
ÉvénementonValueChange(Consumer<Double> callback)Code exécuté chaque fois que la valeur change. Reçoit la nouvelle valeur en paramètre.
-
GettergetValue()Retourne la valeur actuelle du slider.
Support texture
La piste et le curseur (thumb) peuvent chacun recevoir une texture indépendante.
-
FluenttrackImage(ResourceLocation texture)Texture de la piste (le rail sur lequel glisse le curseur).
-
FluenttrackScaleMode(ScaleMode mode)Mode d'étirement de la texture de piste.
-
FluenttrackImageTint(int argb)Teinte ARGB sur la texture de piste.
-
FluenttrackSliceBorder(int pixels)Taille des coins pour le mode
NINE_SLICEsur la piste. -
FluentthumbImage(ResourceLocation texture)Texture du curseur (la poignée que le joueur déplace).
-
FluentthumbScaleMode(ScaleMode mode)Mode d'étirement de la texture du curseur.
-
FluentthumbImageTint(int argb)Teinte ARGB sur la texture du curseur.
Checkbox
Une Checkbox est une case à cocher — le joueur clique dessus pour l'activer ou la désactiver.
Parfait pour les options "activer/désactiver", les préférences, les conditions d'utilisation.
import fr.eri.eriapi.gui.components.Checkbox;
// Une case à cocher pour les notifications
Checkbox caseNotifs = new Checkbox(100, 200, 200, 24)
.label("Activer les notifications") // Texte à côté de la case
.checked(true) // Cochée par défaut
.onToggle(checked -> {
// Appelé quand l'état change
// "checked" est true si cochée, false si décochée
if (checked) {
System.out.println("Notifications activées");
} else {
System.out.println("Notifications désactivées");
}
});
addComponent(caseNotifs);
// Une case décochée par défaut
Checkbox caseSon = new Checkbox(100, 240, 180, 24)
.label("Activer le son")
.checked(false)
.onToggle(checked -> setSound(checked));
addComponent(caseSon);
// Lire l'état depuis un bouton :
Button btnSauvegarder = new Button(100, 300, 200, 45)
.text("Sauvegarder")
.colorScheme(Button.Style.GREEN)
.onClick(() -> {
boolean notifsActives = caseNotifs.isChecked();
boolean sonActif = caseSon.isChecked();
sauvegarderPreferences(notifsActives, sonActif);
});
-
Fluentlabel(String texte)Texte affiché à côté de la case. Cliquer sur le texte coche/décoche aussi.
-
Fluentchecked(boolean cochée)État initial de la case.
true= cochée,false= décochée. -
ÉvénementonToggle(Consumer<Boolean> callback)Code exécuté quand l'état change. Reçoit
truesi cochée,falsesi décochée. -
GetterisChecked()Retourne
truesi la case est cochée,falsesinon.
Support texture
La case et la coche peuvent chacune avoir une texture distincte.
checkImage utilise ScaleMode.FIT par défaut pour conserver les proportions de l'icône.
-
FluentboxImage(ResourceLocation texture)Texture du carré de la case à cocher (arrière-plan de la case).
-
FluentcheckImage(ResourceLocation texture)Texture de la coche affichée quand la case est cochée. Mode par défaut :
ScaleMode.FIT. -
FluentboxScaleMode(ScaleMode mode)Mode d'étirement de la texture de la case.
-
FluentboxImageTint(int argb)Teinte ARGB appliquée sur la texture de la case.
RadioButton
Un RadioButton est un bouton de sélection circulaire. Il est toujours utilisé en groupe
(voir RadioGroup juste après) — dans un groupe, un seul RadioButton peut être sélectionné
à la fois. Parfait pour les choix exclusifs : "Mode facile / Normal / Difficile".
import fr.eri.eriapi.gui.components.RadioButton;
// Un RadioButton individuel
RadioButton option = new RadioButton(100, 200, 150, 24)
.label("Option A") // Texte à côté du bouton radio
.selected(true) // Sélectionné par défaut
.onSelect(() -> {
// Appelé quand ce bouton est sélectionné
System.out.println("Option A sélectionnée");
});
addComponent(option);
-
Fluentlabel(String texte)Texte affiché à côté du bouton radio.
-
Fluentselected(boolean sélectionné)Sélectionné par défaut. Dans un groupe, un seul devrait être
true. -
ÉvénementonSelect(Runnable callback)Code exécuté quand ce RadioButton est sélectionné.
-
GetterisSelected()Retourne
truesi ce RadioButton est actuellement sélectionné.
RadioGroup
Un RadioGroup gère un ensemble de RadioButton liés entre eux.
Quand tu en sélectionnes un, les autres sont désélectionnés automatiquement. C'est la bonne façon
de créer un choix exclusif (un seul élément peut être choisi à la fois).
import fr.eri.eriapi.gui.components.RadioGroup;
import fr.eri.eriapi.gui.components.RadioButton;
// Créer les 3 boutons radio pour la difficulté
RadioButton rbFacile = new RadioButton(100, 200, 160, 28)
.label("Facile").selected(true); // Sélectionné par défaut
RadioButton rbNormal = new RadioButton(100, 236, 160, 28)
.label("Normal");
RadioButton rbDifficile = new RadioButton(100, 272, 160, 28)
.label("Difficile");
// Créer le groupe et y ajouter les boutons
// Le groupe gère automatiquement la logique "un seul sélectionné"
RadioGroup groupeDifficulte = new RadioGroup()
.add("facile", rbFacile) // "facile" = identifiant unique de cette option
.add("normal", rbNormal)
.add("difficile", rbDifficile)
.select("facile") // Sélectionner "facile" par défaut
.onSelect(id -> {
// Appelé quand une option est sélectionnée
// "id" contient l'identifiant choisi ("facile", "normal" ou "difficile")
System.out.println("Difficulté choisie : " + id);
});
// Ajouter les RadioButtons (pas le groupe) à la GUI
addComponent(rbFacile);
addComponent(rbNormal);
addComponent(rbDifficile);
// Récupérer la sélection actuelle depuis un bouton :
Button btnValider = new Button(100, 320, 200, 45)
.text("Commencer")
.colorScheme(Button.Style.GREEN)
.onClick(() -> {
String difficulte = groupeDifficulte.getSelected(); // "facile", "normal" ou "difficile"
lancerPartie(difficulte);
});
-
Fluentadd(String id, RadioButton bouton)Ajoute un RadioButton au groupe avec un identifiant unique. L'identifiant est retourné par
getSelected(). -
Fluentselect(String id)Sélectionne programmatiquement un bouton par son identifiant. Les autres sont désélectionnés.
-
ÉvénementonSelect(Consumer<String> callback)Code exécuté quand la sélection change. Reçoit l'identifiant du bouton nouvellement sélectionné.
-
GettergetSelected()Retourne l'identifiant du bouton actuellement sélectionné.
Charts (Graphiques)
Les composants Chart te permettent d'afficher des données sous forme visuelle directement dans ton GUI Minecraft — courbes, barres, camembert. C'est parfait pour un tableau de bord de statistiques, un classement, ou n'importe quel affichage de données numériques.
Tous les graphiques partagent une base commune (Chart) qui gère le titre, les axes, la grille
et les couleurs. Tu n'utilises jamais Chart directement — tu choisis l'un de ses trois enfants :
LineChart, BarChart ou PieChart.
Chart est une classe abstraite : tu ne peux pas faire new Chart(). Elle sert
juste à définir des comportements et des options communs à tous les graphiques. C'est comme un "modèle" que
LineChart, BarChart et PieChart suivent tous.
Classe de base pour tous les graphiques. Elle définit les options visuelles communes : titre, labels des axes, grille, couleurs de fond et de bordure. Ces méthodes sont disponibles sur tous les types de graphiques.
-
Fluenttitle(String titre)Affiche un titre centré en haut du graphique.
-
FluentxLabel(String label)Texte affiché sous l'axe horizontal (axe X). Par exemple :
"Temps (s)". -
FluentyLabel(String label)Texte affiché à gauche de l'axe vertical (axe Y). Par exemple :
"Score". -
FluentchartPadding(int padding)Espace intérieur (en pixels design) entre le bord du composant et la zone de dessin du graphique. Défaut : 25.
-
FluenttitleHeight(int hauteur)Hauteur réservée pour le titre en haut du graphique. Défaut : 12 px design.
-
FluentgridLines(int nombre)Nombre de lignes de grille horizontales tracées dans la zone de dessin. Défaut : 5.
-
FluentshowGrid(boolean afficher)Active ou désactive l'affichage de la grille de fond. Par défaut activée.
-
FluentbackgroundColor(int couleur)Couleur de fond de la zone de graphique au format
0xAARRGGBB. Défaut :0xFF1A1A2A(bleu très sombre). -
FluentgridColor(int couleur)Couleur des lignes de la grille. Défaut :
0xFF303045. -
FluentaxisColor(int couleur)Couleur des axes X et Y. Défaut :
0xFF505070. -
FluenttextColor(int couleur)Couleur du texte (titre, labels, valeurs). Défaut : blanc.
-
FluentborderColor(int couleur)Couleur de la bordure autour du graphique. Défaut :
0xFF404060.
Un graphique en courbes. Tu peux afficher plusieurs séries de données (datasets) en même temps, chacune avec sa propre couleur et son propre nom dans la légende. Idéal pour suivre l'évolution d'une valeur dans le temps (score, vie, distance...).
Chaque point de données est un objet LineChart.DataPoint qui contient une valeur X et une
valeur Y. Tu regroupes tes points dans une List et tu passes cette liste à
addDataset().
import fr.eri.eriapi.gui.components.charts.LineChart;
import java.util.Arrays;
// Crée les points pour la série "Vie"
List<LineChart.DataPoint> pointsVie = Arrays.asList(
new LineChart.DataPoint(0, 100),
new LineChart.DataPoint(1, 85),
new LineChart.DataPoint(2, 60),
new LineChart.DataPoint(3, 90),
new LineChart.DataPoint(4, 75)
);
// Crée les points pour la série "Mana"
List<LineChart.DataPoint> pointsMana = Arrays.asList(
new LineChart.DataPoint(0, 50),
new LineChart.DataPoint(1, 30),
new LineChart.DataPoint(2, 80),
new LineChart.DataPoint(3, 65),
new LineChart.DataPoint(4, 90)
);
LineChart graphique = new LineChart()
.originalPos(50, 50)
.originalSize(300, 180)
.title("Statistiques du joueur")
.xLabel("Temps (min)")
.yLabel("Points")
.addDataset("Vie", pointsVie)
.addDataset("Mana", pointsMana)
.datasetColor("Vie", 0xFF00C864) // Vert pour la vie
.datasetColor("Mana", 0xFF00AAFF) // Bleu pour le mana
.showLegend(true)
.showDots(true)
.showGrid(true);
addComponent(graphique);
-
FluentaddDataset(String nom, List<DataPoint> points)Ajoute une série de données au graphique. Chaque série a un nom unique qui sert aussi de label dans la légende.
-
FluentdatasetColor(String nom, int couleur)Définit la couleur de la courbe et des points d'une série. La couleur est au format
0xAARRGGBB. -
FluentremoveDataset(String nom)Supprime la série dont le nom correspond. Utile pour mettre à jour le graphique dynamiquement.
-
FluentclearDatasets()Supprime toutes les séries d'un coup. Pratique pour recharger le graphique avec de nouvelles données.
-
FluentshowLegend(boolean afficher)Affiche ou masque la légende listant les noms et couleurs de chaque série.
-
FluentshowDots(boolean afficher)Affiche ou masque les points (ronds) à chaque coordonnée de donnée sur la courbe.
-
FluentlineWidth(int epaisseur)Épaisseur en pixels de chaque courbe tracée.
-
FluentyLabelDecimals(int decimales)Nombre de décimales affichées sur les labels de l'axe Y (et dans le tooltip de survol des points). Valeur par défaut : 1. Mettre 0 pour forcer un affichage entier.
Un graphique en barres verticales. Chaque barre a un label (affiché sous la barre) et une valeur (affichée au-dessus). Tu peux choisir une couleur par barre individuelle ou définir une couleur globale. La détection de survol (hover) est incluse automatiquement.
import fr.eri.eriapi.gui.components.charts.BarChart;
BarChart barres = new BarChart()
.originalPos(50, 50)
.originalSize(300, 180)
.title("Kills par joueur")
.yLabel("Kills")
.addBar("Alice", 42, 0xFF00C864) // Barre verte
.addBar("Bob", 18, 0xFF00AAFF) // Barre bleue
.addBar("Carol", 35, 0xFFFF8800) // Barre orange
.addBar("Dave", 7, 0xFFFF4444) // Barre rouge
.showValues(true) // Affiche les valeurs au-dessus des barres
.showLabels(true) // Affiche les noms sous les barres
.barSpacing(4) // Espace entre les barres
.hoverBarColor(0xFFFFDD00); // Couleur au survol (jaune)
addComponent(barres);
-
FluentaddBar(String label, float valeur)Ajoute une barre avec son label et sa valeur. Utilise la couleur globale définie par
barColor(). -
FluentaddBar(String label, float valeur, int couleur)Ajoute une barre avec sa propre couleur individuelle (remplace la couleur globale pour cette barre uniquement).
-
FluentupdateBar(String label, float nouvelleValeur)Met à jour la valeur d'une barre existante (identifiée par son label). Pratique pour des données qui changent en temps réel.
-
FluentclearBars()Supprime toutes les barres. Utile pour recharger complètement le graphique.
-
FluentbarColor(int couleur)Couleur globale appliquée à toutes les barres qui n'ont pas de couleur individuelle.
-
FluenthoverBarColor(int couleur)Couleur affichée quand la souris survole une barre.
-
FluentbarSpacing(int espace)Espace en pixels design entre chaque barre.
-
FluentshowValues(boolean afficher)Affiche ou masque la valeur numérique au-dessus de chaque barre.
-
FluentshowLabels(boolean afficher)Affiche ou masque le label textuel sous chaque barre.
-
FluentvalueFormat(String format)Format d'affichage des valeurs. Par exemple
"%.0f pts"affichera"42 pts". Utilise la syntaxe JavaString.format().
Un graphique en camembert (aussi appelé "pie chart" ou "diagramme circulaire"). Chaque tranche représente une catégorie. Tu peux afficher les pourcentages directement sur les tranches et une légende à côté. Le nombre de segments utilisés pour dessiner chaque tranche est configurable pour ajuster la fluidité du rendu.
import fr.eri.eriapi.gui.components.charts.PieChart;
PieChart camembert = new PieChart()
.originalPos(50, 50)
.originalSize(200, 200)
.title("Répartition des dégâts")
.addSlice("Épée", 55, 0xFFFF4444) // Rouge
.addSlice("Arc", 25, 0xFF00AAFF) // Bleu
.addSlice("Magie", 15, 0xFFCC44FF) // Violet
.addSlice("Chute", 5, 0xFFFFAA00) // Orange
.showPercentage(true) // Affiche "55%" sur la tranche épée
.showLegend(true) // Affiche la légende à côté
.segments(64); // 64 segments pour un rendu lisse
addComponent(camembert);
-
FluentaddSlice(String label, float valeur, int couleur)Ajoute une tranche avec son label, sa valeur (proportion relative) et sa couleur. Les valeurs n'ont pas besoin de faire 100 — le graphique les normalise automatiquement.
-
FluentaddSlice(String label, float valeur)Ajoute une tranche sans couleur personnalisée — le graphique lui attribue automatiquement une couleur depuis sa palette interne.
-
FluentclearSlices()Supprime toutes les tranches. Utile pour recharger le graphique avec de nouvelles données.
-
FluentshowLegend(boolean afficher)Affiche ou masque la légende listant les labels et couleurs de chaque tranche.
-
FluentshowPercentage(boolean afficher)Affiche ou masque le pourcentage calculé automatiquement sur chaque tranche du camembert.
-
Fluentsegments(int nombre)Nombre de segments OpenGL utilisés pour dessiner chaque tranche. Plus le nombre est élevé, plus le contour est lisse. Valeur recommandée : 32 à 64.
ColorWheel
Une ColorWheel est une roue chromatique interactive. Le joueur clique et fait glisser
son curseur sur le disque pour choisir une teinte (hue) et une saturation. La luminosité peut être
contrôlée séparément via un BrightnessSlider lié.
Le composant fonctionne en espace HSB (Hue / Saturation / Brightness). La couleur sélectionnée est
ensuite convertie en entier ARGB standard et transmise au callback onColorChange.
import fr.eri.eriapi.gui.components.ColorWheel;
// Roue chromatique centrée sur (50, 50), rayon de 50 px design
ColorWheel wheel = new ColorWheel()
.originalPos(50, 50)
.originalSize(100, 100)
.defaultColor(0xFFFF0000) // Couleur de départ : rouge
.onColorChange(color -> {
// Appelé à chaque déplacement du curseur
System.out.println("Couleur choisie : #" + Integer.toHexString(color));
});
addComponent(wheel);
// Lire la couleur courante depuis un bouton :
Button btnAppliquer = new Button(50, 170, 100, 30)
.text("Appliquer")
.colorScheme(Button.Style.CYAN)
.onClick(() -> {
int couleur = wheel.getSelectedColor(); // Entier ARGB
float teinte = wheel.getHue(); // 0.0 – 1.0
float saturation = wheel.getSaturation(); // 0.0 – 1.0
float luminosite = wheel.getBrightness(); // 0.0 – 1.0
appliquerCouleur(couleur);
});
-
FluentdefaultColor(int argb)Définit la couleur sélectionnée au démarrage. La roue se positionne automatiquement sur cette teinte et saturation.
-
Fluentradius(int rayonDesign)Rayon de la roue en pixels design. La taille réelle s'adapte automatiquement à la résolution.
-
Fluentbrightness(float valeur)Luminosité initiale de la roue, entre
0.0(noir) et1.0(couleur pure). Modifiable ensuite par unBrightnessSlider. -
ÉvénementonColorChange(Consumer<Integer> callback)Code exécuté chaque fois que la couleur change (drag de souris). Reçoit la couleur ARGB en paramètre.
-
GettergetSelectedColor()Retourne la couleur actuellement sélectionnée sous forme d'entier ARGB (
0xAARRGGBB). -
GettergetHue()Retourne la teinte (hue) sélectionnée, valeur entre
0.0et1.0(0 = rouge, 0.33 = vert, 0.66 = bleu). -
GettergetSaturation()Retourne la saturation sélectionnée, valeur entre
0.0(gris) et1.0(couleur pure). -
GettergetBrightness()Retourne la luminosité actuelle, valeur entre
0.0(noir) et1.0(pleine luminosité).
BrightnessSlider
Un BrightnessSlider est un slider spécialisé, conçu pour fonctionner de pair avec une
ColorWheel. Il affiche un dégradé de noir (gauche) vers la couleur pure actuellement
sélectionnée sur la roue (droite), et permet au joueur de régler la luminosité de façon intuitive.
La liaison avec la ColorWheel est automatique : quand la teinte change sur la roue,
le dégradé du slider se met à jour en temps réel.
BrightnessSlider étend Slider. Toutes les méthodes de Slider
sont donc disponibles (value(), onValueChange(), getValue(), etc.),
en plus des fonctionnalités spécifiques à la luminosité.
import fr.eri.eriapi.gui.components.ColorWheel;
import fr.eri.eriapi.gui.components.BrightnessSlider;
// 1. Créer la roue chromatique
ColorWheel wheel = new ColorWheel()
.originalPos(50, 50)
.originalSize(100, 100)
.defaultColor(0xFF00AAFF);
// 2. Lier le slider à la roue — le dégradé se met à jour automatiquement
BrightnessSlider slider = new BrightnessSlider(wheel)
.originalPos(50, 160)
.originalSize(100, 14);
addComponent(wheel);
addComponent(slider);
-
ConstructeurBrightnessSlider(ColorWheel roue)Constructeur principal. Lie immédiatement le slider à la
ColorWheeldonnée. Le dégradé et la valeur de luminosité sont synchronisés automatiquement.
Pour une sélection de couleur complète (roue + luminosité + aperçu), utilise directement le composant
ColorPicker qui assemble tout automatiquement.
ColorPicker
Le ColorPicker est un composant complet de sélection de couleur. Il regroupe dans un
seul bloc : une ColorWheel, un BrightnessSlider, un champ texte hexadécimal
et un aperçu de la couleur sélectionnée.
La synchronisation est bidirectionnelle : modifier la roue met à jour le champ hex, et saisir une valeur hex repositionne la roue. C'est le composant recommandé pour tout sélecteur de couleur dans tes interfaces.
import fr.eri.eriapi.gui.components.ColorPicker;
// Sélecteur de couleur tout-en-un
ColorPicker picker = new ColorPicker()
.originalPos(50, 50)
.originalSize(120, 170)
.defaultColor(0xFF00AAFF) // Couleur initiale : bleu ciel
.backgroundColor(0xFF2A2A2A) // Fond du panneau
.onChange(color -> {
// Appelé à chaque changement de couleur (roue, slider OU champ hex)
System.out.println("Nouvelle couleur : #" + Integer.toHexString(color));
appliquerCouleur(color);
});
addComponent(picker);
// Lire la couleur à tout moment :
Button btnValider = new Button(50, 240, 120, 32)
.text("Valider")
.colorScheme(Button.Style.GREEN)
.onClick(() -> {
int couleurChoisie = picker.getColor(); // Entier ARGB
sauvegarderCouleur(couleurChoisie);
});
-
FluentdefaultColor(int argb)Couleur affichée à l'ouverture du composant. Initialise la roue, le slider et le champ hex de façon cohérente.
-
FluentbackgroundColor(int argb)Couleur de fond du panneau du ColorPicker.
-
ÉvénementonChange(Consumer<Integer> callback)Code exécuté chaque fois que la couleur change, quelle que soit la source (roue, slider ou saisie hex). Reçoit la couleur ARGB.
-
GettergetColor()Retourne la couleur actuellement sélectionnée sous forme d'entier ARGB (
0xAARRGGBB).
Le ColorPicker est un ContainerComponent. Il instancie et gère lui-même
en interne une ColorWheel, un BrightnessSlider, un TextField
pour la valeur hex, et un Rectangle d'aperçu. Tu n'as pas à les créer séparément.
GradientRectangle
GradientRectangle est un rectangle avec un degrade lineaire (vertical ou horizontal)
et des coins arrondis optionnels. Il remplace avantageusement Rectangle quand tu veux
des fonds degrades (panneau, barre de statut, separateur).
import fr.eri.eriapi.gui.components.GradientRectangle;
// Degrade vertical (haut -> bas) violet -> bleu
new GradientRectangle()
.originalPos(100, 100).originalSize(400, 200)
.vertical(0xFF6B2FA0, 0xFF00E5FF)
.cornerRadius(12);
// Degrade horizontal (gauche -> droite) cyan -> transparent
new GradientRectangle()
.originalPos(0, 0).originalSize(1920, 4)
.horizontal(0xFF00E5FF, 0x0000E5FF); // fondu vers transparent
// Degrade vertical avec alpha (fond semi-transparent)
new GradientRectangle()
.originalPos(660, 340).originalSize(600, 400)
.vertical(0xCC1A1A2E, 0xCC2A1A3E)
.cornerRadius(16);
-
Fluentvertical(int topColor, int bottomColor)Definit un degrade de haut en bas. Les deux couleurs sont en format ARGB (
0xAARRGGBB). -
Fluenthorizontal(int leftColor, int rightColor)Definit un degrade de gauche a droite.
-
FluentcornerRadius(int radius)Arrondit les coins en pixels de design. Le degrade est correctement applique aux coins arrondis.
Aurora
Aurora est un composant decoratif qui dessine des bandes d'aurore boreale — des vagues
sinusoidales superposees avec un degrade vertical, animees en continu. Jusqu'a 10 bandes
independantes peuvent etre configurees, chacune avec sa propre couleur, frequence et vitesse.
Ce composant s'anime automatiquement via System.currentTimeMillis() — aucune
configuration d'AnimationManager n'est requise.
import fr.eri.eriapi.gui.components.Aurora;
// Aurora en fond de GUI (pleine largeur, haut de l'ecran)
Aurora aurora = new Aurora()
.originalPos(0, 0)
.originalSize(1920, 500)
.addBand(0x406B2FA0, 0.3f, 1.2f, 80, 50) // violet, 1 vague, amplitude 1.2, hauteur 80px, yOffset 50
.addBand(0x3000E5FF, 0.5f, 0.8f, 60, 120) // cyan, 1.5 vagues, amplitude 0.8
.addBand(0x20FF6B6B, 0.7f, 0.6f, 50, 200) // rose subtil
.speed(0.02f) // vitesse des vagues (defaut: 0.015)
.segments(80); // lisse (defaut: 64)
root.add(aurora);
-
FluentaddBand(int color, float frequency, float amplitude, int height, int yOffset)Ajoute une bande d'aurore. color : couleur ARGB (le bas sera transparent). frequency : nombre de cycles sinusoidaux sur la largeur (ex : 0.5 = une demi-vague, 1.0 = une vague complete). amplitude : hauteur de l'ondulation en design pixels. height : epaisseur du degrade de la bande en design pixels. yOffset : position Y de la bande relative au composant. Max 10 bandes.
-
Fluentspeed(float speed)Vitesse de deplacement des vagues. Defaut :
0.015f. Plus grand = plus rapide. -
Fluentsegments(int segments)Nombre de segments par bande pour la fluidite. Defaut :
64. Minimum :16.
Starfield
Starfield est un champ d'etoiles decoratif avec scintillement sinusoidal et etoiles filantes
aleatoires. Les etoiles ont des tailles, phases et vitesses de scintillement variees pour un rendu naturel.
Jusqu'a 3 etoiles filantes peuvent etre actives simultanement.
import fr.eri.eriapi.gui.components.Starfield;
new Starfield()
.originalPos(0, 0)
.originalSize(1920, 1080)
.starCount(80) // nombre d'etoiles statiques
.starColor(0xFFF0F2FF) // couleur (blanc legerement bleu)
.shootingStarChance(0.003f); // probabilite d'etoile filante par frame
// 0 = jamais, 0.01 = tres frequent
-
FluentstarCount(int count)Nombre d'etoiles statiques a generer. Defaut :
50. -
FluentstarColor(int argb)Couleur des etoiles. Defaut :
0xFFF0F2FF(blanc casse). -
FluentshootingStarChance(float chance)Probabilite par frame qu'une etoile filante apparaisse. Defaut :
0.002f.0= jamais. Max 3 simultanees.
ParticleSystem
ParticleSystem est un systeme de particules GPU-friendly. Les particules sont
des cercles soft (gradient radial du centre vers transparent) qui naissent, grandissent,
derivent et s'estompent progressivement. Le blending est additif — les particules
qui se chevauchent fusionnent et s'eclaircissent.
import fr.eri.eriapi.gui.components.ParticleSystem;
// Particules qui montent doucement (fumee legere)
new ParticleSystem()
.originalPos(0, 600).originalSize(1920, 480)
.maxParticles(40)
.spawnRate(0.6f) // ~0.6 particule par frame (36/s a 60fps)
.particleLife(3000, 6000) // duree de vie : 3 a 6 secondes
.particleSize(30, 100) // grossit de 30 a 100 design px au cours de sa vie
.particleColor(0x206B2FA0) // violet tres transparent (blending additif)
.drift(0, -0.008f) // monte lentement
.spread(0.012f) // dispersion aleatoire legere
.fadeIn(0.15f) // fondu entrant sur 15% de la vie
.fadeOut(0.35f); // fondu sortant sur 35% de la vie
// Particules sur les bords uniquement
new ParticleSystem()
.originalPos(0, 0).originalSize(1920, 1080)
.maxParticles(20)
.spawnOnEdges(true) // spawn sur les bords de la zone
.drift(0.005f, 0.002f)
.particleColor(0x3000E5FF);
-
FluentmaxParticles(int max)Nombre maximum de particules simultanees (cap a 200). Defaut :
30. -
FluentspawnRate(float rate)Particules emises par frame.
0.5= 1 particule toutes les 2 frames. Defaut :0.5f. -
FluentparticleLife(int minMs, int maxMs)Duree de vie min/max des particules en millisecondes. Defaut :
3000, 6000. -
FluentparticleSize(int startPx, int endPx)Taille de la particule en design pixels (debut de vie, fin de vie). La particule grossit progressivement. Defaut :
40, 120. -
FluentparticleColor(int argb)Couleur ARGB des particules. L'alpha de la couleur est multiplie par les facteurs de fade. Defaut :
0x20FFFFFF. -
Fluentdrift(float dx, float dy)Derive constante en px/ms.
dynegatif = monte. Defaut :0, -0.008f. -
Fluentspread(float s)Vitesse aleatoire ajoutee a la derive (dispersion). Plus grand = plus chaotique. Defaut :
0.015f. -
FluentfadeIn(float ratio) / fadeOut(float ratio)Fraction de la vie utilisee pour le fondu d'apparition / disparition (0-1). Defaut :
0.15f, 0.3f. -
FluentspawnOnEdges(boolean edges)Si
true, les particules naissent sur les bords de la zone plutot qu'a l'interieur.
SmokeFog
SmokeFog est un brouillard organique base sur du bruit Simplex fractal (FBM —
Fractional Brownian Motion). Il dessine une grille de quads dont l'alpha est module par le bruit,
anime dans le temps. Le resultat est un brouillard qui coule et se deforme naturellement.
Contrairement a ParticleSystem, SmokeFog est completement continu —
pas de particules individuelles, juste une texture procedurale qui evolue.
import fr.eri.eriapi.gui.components.SmokeFog;
// Brouillard violet subtil en fond de GUI
new SmokeFog()
.originalPos(0, 0).originalSize(1920, 1080)
.color(0x6B2FA0) // couleur RGB (sans alpha — l'alpha est gere par intensity)
.intensity(0.08f) // alpha max (0-1). 0.05-0.15 = tres subtil, 0.3+ = visible
.scale(0.006f) // echelle du bruit. Petit = grands motifs
.speed(0.0003f) // vitesse d'evolution du bruit
.wind(0.0001f, -0.00005f) // derive legere
.octaves(3) // detail fractal (2-6). Plus = plus de detail mais plus couteux
.persistence(0.5f) // persistence FBM (0-1). 0.5 = standard
.cellSize(12); // taille de chaque cellule en px ecran. Plus petit = plus lisse
-
Fluentcolor(int rgb)Couleur RGB du brouillard sans alpha (ex :
0x6B2FA0). L'alpha est controle parintensity(). -
Fluentintensity(float i)Alpha maximum du brouillard (0-1).
0.05-0.12= tres subtil,0.2-0.35= bien visible. Defaut :0.10f. -
Fluentscale(float s)Echelle spatiale du bruit. Plus petit = motifs plus grands et organiques. Defaut :
0.007f. -
Fluentspeed(float s)Vitesse d'evolution temporelle du bruit (animation). Defaut :
0.0003f. -
Fluentwind(float wx, float wy)Derive constante du brouillard (px/ms). Cree un effet de vent. Defaut :
0.0001f, -0.00008f. -
Fluentoctaves(int o)Octaves FBM — nombre de couches de bruit superposees (1-6). Plus = plus de detail mais plus couteux. Defaut :
3. -
Fluentpersistence(float p)Persistence FBM (0-1). Controle l'influence des octaves hautes. Defaut :
0.5f. -
FluentcellSize(int s)Taille de chaque cellule de la grille en pixels ecran. Plus petit = rendu plus lisse mais plus couteux. Minimum :
4. Defaut :10.
PageView
PageView est un conteneur a pages avec transitions animees. Quand tu changes de page,
le contenu actuel glisse vers le haut en disparaissant (fade out) pendant que le nouveau contenu
arrive depuis le bas (fade in). Le deplacement est court et subtil — le contenu ne sort pas
visuellement du conteneur.
import fr.eri.eriapi.gui.components.PageView;
import fr.eri.eriapi.gui.core.ContainerComponent;
// Creer le PageView
PageView pageView = new PageView()
.originalPos(300, 100)
.originalSize(800, 600)
.transitionDuration(10) // transition en 10 ticks (0.5s)
.transitionEasing(Easing.EASE_OUT_CUBIC)
.slideDistance(40); // le contenu glisse de 40 design px
// Creer les pages (des ContainerComponent)
ContainerComponent page1 = new ContainerComponent()
.originalPos(0, 0).originalSize(800, 600);
page1.add(new Label(20, 20, 760, 30, "Page 1 — Profil"));
ContainerComponent page2 = new ContainerComponent()
.originalPos(0, 0).originalSize(800, 600);
page2.add(new Label(20, 20, 760, 30, "Page 2 — Stats"));
// Definir la page initiale (sans animation)
pageView.setContent(page1);
// Naviguer vers une autre page (avec transition)
new Button("Stats").onClick(() -> pageView.switchTo(page2));
root.add(pageView);
-
FluenttransitionDuration(int ticks)Duree de la transition en ticks. Defaut :
10(0.5 seconde). -
FluenttransitionEasing(Easing easing)Easing de la transition. Defaut :
EASE_OUT_CUBIC. -
FluentslideDistance(int designPx)Distance de glissement en design pixels. Plus petit = plus subtil. Defaut :
50. -
Methodevoid setContent(ContainerComponent content)Definit le contenu initial sans animation. A appeler lors du premier affichage.
-
Methodevoid switchTo(ContainerComponent newContent)Change de page avec animation slide + fade. Si une transition est deja en cours, elle est terminee immediatement avant de lancer la nouvelle.
-
Getterboolean isTransitioning()Retourne
truesi une transition est en cours. -
GetterContainerComponent getCurrentContent()Retourne le contenu actuellement affiche (
nullsi aucun).
Easing
L'enum Easing définit les fonctions d'interpolation pour les animations.
Chaque fonction transforme une progression linéaire (0→1) en une courbe plus naturelle.
| Valeur | Description | Usage typique |
|---|---|---|
LINEAR | Progression lineaire constante | Barres de progression, compteurs |
EASE_IN | Demarrage lent (t²) | Disparitions, fermetures |
EASE_OUT | Fin lente, easing par defaut | Apparitions, ouvertures |
EASE_IN_OUT | Lent aux deux bouts (smoothstep) | Transitions bidirectionnelles, breathe |
EASE_IN_CUBIC | Demarrage tres lent (t³) | Disparitions dramatiques |
EASE_OUT_CUBIC | Fin tres lente ((t-1)³+1) | Slides, deplacements naturels |
BOUNCE | Rebond decroissant a l'arrivee | Elements qui "tombent" a leur place |
ELASTIC | Oscillation amortie (ressort) | Effets playful, notifications |
EASE_IN_BACK | Recul puis avance (overshoot entree) | Disparitions avec effet "tirage" |
EASE_OUT_BACK | Avance puis stabilisation (overshoot sortie) | Effet "pop" satisfaisant, apparitions |
EASE_IN_EXPO | Tres lent puis explosion exponentielle | Transitions de scene percutantes |
EASE_OUT_EXPO | Explosion puis freinage exponentiel | Menus qui s'ouvrent rapidement |
SPRING | Simulation de ressort (oscillations amorties) | Animations "physiques", sliders |
// Appliquer un easing a une animation
Animation.create(0, 1, 20)
.easing(Easing.EASE_OUT_BACK) // overshoot puis stabilisation
.onUpdate(v -> composant.setOpacity(v));
// Usage direct de la fonction :
float result = Easing.BOUNCE.apply(0.5f);
// Easings les plus utilises en pratique :
// EASE_OUT_CUBIC → slides et deplacements (naturel, rapide)
// EASE_IN_OUT → animations pingpong / breathe (symétrique)
// EASE_OUT_BACK → apparitions avec "pop" (satisfaisant)
// SPRING → boutons ou composants avec physique de ressort
Animation
La classe Animation représente une animation en cours.
Elle interpole une valeur entre from et to sur une durée en ticks (20 ticks = 1 seconde).
import fr.eri.eriapi.gui.anim.*;
// Animation simple : 0 → 1 en 20 ticks (1 seconde)
Animation anim = Animation.create(0, 1, 20)
.easing(Easing.EASE_OUT)
.delay(5) // attendre 5 ticks avant de demarrer
.onUpdate(value -> monComposant.setOpacity(value))
.onComplete(() -> System.out.println("Termine !"));
AnimationManager.getInstance().play(anim);
// Animation en millisecondes (timing precis, independant du tick rate)
Animation.createMs(0, 1, 500L) // 500 millisecondes exactes
.easing(Easing.EASE_OUT)
.onUpdate(v -> comp.setOpacity(v));
// Animation de couleur (interpolation ARGB canal par canal)
Animation.createColor(0xFF6B2FA0, 0xFF00E5FF, 30)
.pingPong()
.scope("overlay")
.onColorUpdate(color -> rect.fillColor(color));
// Boucle infinie (from → to → from → to...)
Animation.create(0, 1, 10)
.pingPong() // aller-retour infini
.easing(Easing.EASE_IN_OUT)
.onUpdate(v -> label.setOpacity(v));
// Boucle N fois
Animation.create(0, 100, 15)
.loop(3) // repete 3 fois puis s'arrete
.onUpdate(v -> bar.progress(v / 100f));
// PingPong N cycles (1 cycle = aller + retour)
Animation.create(0.4f, 1f, 20)
.pingPong(3) // 3 aller-retours puis s'arrete
.easing(Easing.EASE_IN_OUT)
.onUpdate(v -> comp.setOpacity(v));
// Scope pour proteger l'animation de stopGuiAnimations()
Animation.create(0, 1, 30)
.loop()
.scope("overlay") // ne sera pas arrete a la fermeture d'un GUI
.onUpdate(v -> hudComp.setOpacity(v));
// Controle
anim.pause();
anim.resume();
anim.stop();
anim.isFinished();
anim.isPaused();
AnimationManager
Le AnimationManager est un singleton qui gère toutes les animations actives.
Il est automatiquement intégré dans le render loop de EriGuiScreen —
tu n'as qu'à appeler play().
AnimationManager manager = AnimationManager.getInstance();
// Lancer une animation
manager.play(Animation.create(0, 100, 20).easing(Easing.BOUNCE));
// Nombre d'animations actives
int count = manager.activeCount();
// Arreter toutes les animations SANS scope (les animations GUI)
// Appele automatiquement par EriGuiScreen.onGuiClosed()
manager.stopGuiAnimations();
// Arreter TOUTES les animations (y compris celles avec scope)
manager.stopAll();
stopGuiAnimations() arrete uniquement les animations dont le scope est null
(animations GUI standard). Les animations avec .scope("overlay") ou tout autre scope
non nul sont preservees. C'est ce qui est appele automatiquement quand un GUI est ferme.
stopAll() arrete absolutement toutes les animations actives, quel que soit leur scope.
AnimationSequence
AnimationSequence enchaine des animations sequentiellement — chaque animation
demarre quand la precedente se termine. Tu peux aussi ajouter des pauses entre les etapes.
import fr.eri.eriapi.gui.anim.AnimationSequence;
// Compte a rebours 3... 2... 1... Go !
AnimationSequence.create()
.then(Animation.create(0, 1, 5)
.onComplete(() -> titleLabel.text("3...")))
.thenDelay(20) // pause 20 ticks (1 seconde)
.then(Animation.create(0, 1, 5)
.onComplete(() -> titleLabel.text("2...")))
.thenDelay(20)
.then(Animation.create(0, 1, 5)
.onComplete(() -> titleLabel.text("1...")))
.thenDelay(20)
.then(Animation.create(1, 0, 10)
.easing(Easing.EASE_IN)
.onUpdate(v -> titleLabel.setOpacity(v)))
.onComplete(() -> startGame())
.play();
// Sequence de slides d'entree
AnimationSequence.create()
.then(Animation.create(0, 1, 12)
.easing(Easing.EASE_OUT_CUBIC)
.onUpdate(v -> panel1.setOpacity(v)))
.then(Animation.create(0, 1, 12)
.easing(Easing.EASE_OUT_CUBIC)
.onUpdate(v -> panel2.setOpacity(v)))
.then(Animation.create(0, 1, 12)
.easing(Easing.EASE_OUT_CUBIC)
.onUpdate(v -> panel3.setOpacity(v)))
.play();
-
Statiquestatic AnimationSequence create()Cree une nouvelle sequence vide.
-
Fluentthen(Animation anim)Ajoute une animation a la fin de la sequence.
-
FluentthenDelay(int ticks)Ajoute une pause (en ticks) dans la sequence. Pratique pour les comptes a rebours et les enchaînements rythmes.
-
FluentonComplete(Runnable callback)Callback appele quand toute la sequence est terminee.
-
MethodeAnimationSequence play()Demarre la sequence depuis le debut. Les animations sont enregistrees dans
AnimationManagerautomatiquement. -
Methodevoid stop()Arrete la sequence et l'animation en cours.
-
Getterboolean isFinished()Retourne
truesi la sequence est terminee.
AnimationGroup
AnimationGroup joue plusieurs animations en parallele
et declenche un callback quand toutes sont terminees. C'est complementaire
a AnimationSequence — tu peux combiner les deux pour des choreographies complexes.
import fr.eri.eriapi.gui.anim.AnimationGroup;
// Lancer 3 animations en meme temps, callback quand toutes finissent
AnimationGroup.of(
Animation.create(0, 1, 15).easing(Easing.EASE_OUT)
.onUpdate(v -> panelA.setOpacity(v)),
Animation.create(0, 1, 20).easing(Easing.EASE_OUT)
.onUpdate(v -> panelB.setOpacity(v)),
Animation.create(-50, 0, 18).easing(Easing.EASE_OUT_CUBIC)
.onUpdate(v -> panelC.setAnimOffsetX(v))
)
.onAllComplete(() -> System.out.println("Toutes les animations terminees !"))
.play();
// Combinaison : sequence de groupes
AnimationSequence.create()
.then(Animation.create(0, 1, 5).onUpdate(v -> title.setOpacity(v)))
.thenDelay(5)
// Il n'est pas possible d'imbriquer un groupe dans une sequence directement,
// mais tu peux utiliser onComplete() de la sequence pour lancer un groupe :
.onComplete(() -> {
AnimationGroup.of(
Animation.create(0, 1, 10).onUpdate(v -> btn1.setOpacity(v)),
Animation.create(0, 1, 10).onUpdate(v -> btn2.setOpacity(v))
).play();
})
.play();
-
Statiquestatic AnimationGroup of(Animation... anims)Cree un groupe a partir d'animations passees en arguments.
-
Statiquestatic AnimationGroup of(List<Animation> anims)Cree un groupe a partir d'une liste d'animations.
-
FluentonAllComplete(Runnable callback)Callback appele quand toutes les animations du groupe sont terminees.
-
MethodeAnimationGroup play()Lance toutes les animations du groupe en parallele via
AnimationManager. -
Methodevoid stop()Arrete toutes les animations du groupe.
-
Getterboolean isFinished()Retourne
truesi toutes les animations du groupe sont terminees.
Animations pré-faites
Chaque Component dispose de méthodes d'animation pré-faites.
Elles créent et lancent automatiquement l'animation — tu n'as qu'à appeler la méthode.
// Fondu entrant en 10 ticks (0.5 seconde)
button.fadeIn(10);
// Fondu sortant en 15 ticks
panel.fadeOut(15);
// Glissement depuis la gauche, 60px, en 12 ticks
button.slideIn(Component.Direction.LEFT, 60, 12);
// Glissement vers le bas, 40px, en 14 ticks avec easing custom
panel.slideIn(Component.Direction.DOWN, 40, 14).easing(Easing.BOUNCE);
// Sortie vers la droite
label.slideOut(Component.Direction.RIGHT, 80, 10);
// Apparition avec mise à l'echelle (0 → 1)
button.scaleIn(10);
// Disparition avec reduction (1 → 0)
panel.scaleOut(8);
// Tremblement (oscillation horizontale amortie)
button.shake(10);
// Pulse "pop" : le composant grossit brievement puis revient a sa taille
// Ideal pour attirer l'attention (succes, clic confirme, notification)
button.pulse(12); // duree totale en ticks
// Breathe : opacity oscille en boucle infinie (effet "respiration")
// Parfait pour les composants qui attendent une interaction
label.breathe(40); // cycle complet de 40 ticks (2 secondes)
// Breathe avec opacity min/max personnalises
icon.breathe(30, 0.3f, 1.0f); // oscille entre 30% et 100% d'opacite
// Note : breathe() dans un EriGuiScreen sera arrete a la fermeture du GUI.
// Dans un overlay, utilise une animation manuelle avec .scope("overlay") :
Animation.create(0.4f, 1f, 20)
.pingPong()
.scope("overlay")
.easing(Easing.EASE_IN_OUT)
.onUpdate(v -> overlayLabel.setOpacity(v));
AnimationManager.getInstance().play(breatheAnim);
public class MyGui extends EriGuiScreen {
@Override
protected void buildGui() {
GuiFramework.getInstance().setDesignResolution(this.width, this.height);
// Créer les composants
ContainerComponent panel = new ContainerComponent()
.originalPos(100, 100).originalSize(300, 200)
.backgroundColor(Colors.PANEL_BG);
Button btn = new Button("Click me!")
.originalPos(150, 200).originalSize(120, 30)
.colorScheme(0xFF1A8FA0)
.onClick(() -> btn.shake(8));
add(panel, btn);
// Animations d'entrée
panel.fadeIn(12);
btn.slideIn(Component.Direction.DOWN, 40, 15);
}
}
Tooltip
Chaque composant EriAPI peut afficher un tooltip — une bulle d'information apparaissant
quand le curseur stationne sur le composant. Les tooltips sont rendus automatiquement par
EriGuiScreen, aucune configuration supplémentaire n'est requise.
Tu n'as pas à appeler de méthode de rendu manuellement. EriGuiScreen détecte
quel composant est survolé et affiche son tooltip après le délai configuré. Le tooltip est
repositionné automatiquement pour rester dans les limites de l'écran.
-
FluentT tooltip(String text)Définit le texte du tooltip. Supporte les retours à la ligne avec
\nen Java et\\nlittéral depuis les fichiers.lang(les deux sont normalisés automatiquement au rendu). Passernullpour désactiver le tooltip. -
FluentT tooltipDelay(int ticks)Délai avant l'affichage du tooltip en ticks (20 ticks = 1 seconde). Valeur par défaut : 15 ticks (0.75 s).
-
GetterString getTooltip()Retourne le texte du tooltip actuellement configuré, ou
nullsi aucun.
new Button("Acheter")
.originalPos(100, 50)
.originalSize(120, 30)
.onClick(() -> buyItem())
.tooltip("Acheter l'objet selectionne\nPrix : 100 coins");
// Dans fr_FR.lang : tooltip.item.info=Ligne 1\nLigne 2\nLigne 3
// Le \\n litteral du fichier .lang est automatiquement converti en vrai retour a la ligne
new Button("Info")
.originalPos(100, 50)
.originalSize(120, 30)
.tooltip(I18n.format("tooltip.item.info")); // Affiche 3 lignes
// Delai personnalise (40 ticks = 2s)
new Label("Info")
.originalPos(50, 50)
.originalSize(80, 10)
.tooltip("Details supplementaires")
.tooltipDelay(40);
Comportement
| Propriété | Valeur |
|---|---|
| Délai par défaut | 15 ticks (0.75 s) |
| Multi-ligne | Séparateur \n en Java ou \\n littéral depuis les fichiers .lang — les deux fonctionnent |
| Auto-positionnement | Reste dans les bords de l'écran |
| Rendu | Automatique via EriGuiScreen |
| Composants supportés | Tous (héritent de Component) |
Notification
Les notifications sont des messages contextuels qui apparaissent en superposition à l'écran, avec une animation d'entrée et de sortie. Elles informent le joueur sans bloquer l'interface.
Une notification est composée d'un type, d'un message et d'une durée.
Elle est créée via NotificationManager et non instanciée directement.
Types disponibles
| Type | Couleur | Usage |
|---|---|---|
Notification.Type.SUCCESS | Vert | Action réussie (achat, enregistrement...) |
Notification.Type.ERROR | Rouge | Erreur ou action échouée |
Notification.Type.INFO | Bleu | Information neutre |
Notification.Type.WARNING | Orange | Avertissement ou stock faible |
Si 5 notifications sont déjà actives, la plus ancienne est retirée automatiquement pour
laisser place à la nouvelle. Les animations de glissement (slide in/out) sont gérées
automatiquement par NotificationManager.
// Methodes statiques
NotificationManager.success("Achat effectue !");
NotificationManager.error("Solde insuffisant.");
NotificationManager.info("Bienvenue sur le serveur.");
NotificationManager.warning("Stock faible !");
// Duree personnalisee (100 ticks = 5s)
NotificationManager.notify(Notification.Type.INFO, "Message custom", 100);
Comportement
| Propriété | Valeur |
|---|---|
| Durée par défaut | 60 ticks (3 s) |
| Maximum visible | 5 simultanément |
| Animation | Slide in / slide out automatique |
| Rendu | Automatique via EriGuiScreen |
| Position | Coin supérieur droit (empilées) |
Support texture
Le fond d'une notification peut être remplacé par une texture. Par défaut, le mode
NINE_SLICE avec un border de 4 px est utilisé pour que la texture s'adapte à
différentes longueurs de message.
// Via le builder de Notification (si tu crées une notification personnalisée)
notification
.bgImage(new ResourceLocation("monmod", "textures/gui/notif_bg.png"))
.bgScaleMode(ScaleMode.NINE_SLICE)
.bgSliceBorder(4);
-
FluentbgImage(ResourceLocation texture)Texture de fond de la notification. Remplace la couleur de fond unie.
-
FluentbgScaleMode(ScaleMode mode)Mode d'étirement de la texture de fond (par défaut
NINE_SLICE). -
FluentbgSliceBorder(int pixels)Taille des coins pour le mode
NINE_SLICE(par défaut 4).
NotificationManager
NotificationManager est le singleton central qui gère l'affichage et le cycle de vie
de toutes les notifications. Il est câblé automatiquement dans EriGuiScreen —
tu n'as qu'à appeler ses méthodes statiques pour déclencher des notifications.
-
Statiquestatic void success(String message)Affiche une notification de type SUCCESS (verte) avec la durée par défaut (60 ticks).
-
Statiquestatic void error(String message)Affiche une notification de type ERROR (rouge) avec la durée par défaut.
-
Statiquestatic void info(String message)Affiche une notification de type INFO (bleue) avec la durée par défaut.
-
Statiquestatic void warning(String message)Affiche une notification de type WARNING (orange) avec la durée par défaut.
-
Statiquestatic void notify(Notification.Type type, String message, int durationTicks)Affiche une notification avec un type et une durée personnalisés.
-
Internevoid tick()Décrémente les timers et retire les notifications expirées. Appelé automatiquement par
EriGuiScreenà chaque tick. -
Internevoid render(int screenWidth, int screenHeight)Rend toutes les notifications actives. Appelé automatiquement par
EriGuiScreenà chaque frame. -
Méthodevoid clearAll()Supprime immédiatement toutes les notifications en cours (sans animation de sortie).
-
Getterint activeCount()Retourne le nombre de notifications actuellement affichées (entre 0 et 5).
public class GuiBoutique extends EriGuiScreen {
@Override
protected void buildGui() {
Button btnAcheter = new Button("Acheter")
.originalPos(100, 50)
.originalSize(120, 30)
.tooltip("Acheter l'objet selectionne\nPrix : 100 coins")
.onClick(() -> {
if (joueur.getSolde() >= 100) {
joueur.acheter();
NotificationManager.success("Achat effectue !");
} else {
NotificationManager.error("Solde insuffisant.");
// Notification longue pour les erreurs importantes (5s)
// NotificationManager.notify(Notification.Type.ERROR, "Solde insuffisant.", 100);
}
});
Button btnInfo = new Button("?")
.originalPos(240, 50)
.originalSize(30, 30)
.tooltip("Cliquez pour afficher les informations du serveur")
.onClick(() -> NotificationManager.info("Bienvenue sur le serveur."));
add(btnAcheter, btnInfo);
}
}
EriGuiScreen appelle NotificationManager.getInstance().tick() et
.render() automatiquement à chaque frame. Tu n'as pas à les appeler manuellement
dans ton buildGui() ou dans un callback.
Network GUI
La communication client ↔ serveur pour les GUIs EriAPI — envoi d'actions, reception de donnees, et ouverture d'ecrans depuis le serveur — est couverte dans la page de documentation dediee Network GUI.
Consulte network.html pour la reference complete :
GuiNetworkHandler (toutes les methodes statiques),
IGuiDataReceiver (onDataUpdate(String, String, String)),
tableaux de format des paquets, et un exemple complet boutique client/serveur.
Colors
La classe Colors fournit des constantes de couleurs prêtes à l'emploi et des méthodes
utilitaires pour manipuler les couleurs. Toutes les couleurs sont au format ARGB
(0xAARRGGBB).
Palette de couleurs
Méthodes utilitaires
-
Statiqueint Colors.withAlpha(int color, int alpha)Retourne la même couleur mais avec un alpha différent. Alpha : 0 (transparent) à 255 (opaque). Ex:
Colors.withAlpha(Colors.CYAN, 128)= cyan semi-transparent. -
Statiqueint Colors.fromHex(String hex)Crée une couleur depuis une chaîne hexadécimale. Ex:
Colors.fromHex("#00DDFF")ouColors.fromHex("FF00DDFF"). -
Statiqueint Colors.lerp(int colorA, int colorB, float t)Mélange deux couleurs.
t=0.0= colorA,t=1.0= colorB,t=0.5= moitié-moitié. Utile pour les animations. -
Statiqueint Colors.of(int r, int g, int b)Crée une couleur depuis les composantes rouge, vert, bleu (0-255 chacune). Alpha = 255 (opaque).
-
Statiqueint Colors.of(int r, int g, int b, int a)Crée une couleur depuis les composantes rouge, vert, bleu et alpha (0-255 chacune).
import fr.eri.eriapi.gui.util.Colors;
// Utiliser une constante directement
label.color(Colors.WHITE);
label.color(Colors.CYAN);
// Couleur semi-transparente (alpha 128 = 50% opacité)
rectangle.fillColor(Colors.withAlpha(Colors.BLACK, 128));
// Couleur depuis hex (utile si tu copie depuis Photoshop/Figma)
int maColor = Colors.fromHex("#FF6600"); // Orange vif
int maColor2 = Colors.fromHex("80FF6600"); // Orange vif 50% transparent
// Couleur depuis RGB (rouge, vert, bleu)
int rouge = Colors.of(255, 0, 0); // Rouge pur
int bleuPale = Colors.of(100, 160, 240); // Bleu pâle
// Mélange de deux couleurs (animation de fadeout par exemple)
float t = 0.5f; // 50% entre les deux
int fondu = Colors.lerp(Colors.WHITE, Colors.TRANSPARENT, t);
// Résultat : blanc à 50% de transparence
RenderUtil
RenderUtil est une classe d'utilitaires de rendu bas niveau. Tu en as besoin quand tu
crées un ListItem personnalisé ou que tu overrides drawScreen() pour dessiner
quelque chose en dehors des composants standards.
Tu n'as normalement pas besoin de RenderUtil pour créer des GUIs standard.
Utilise les composants (Button, Label, Rectangle, etc.) —
ils utilisent RenderUtil en interne. Réserve RenderUtil pour les
cas où aucun composant standard ne suffit (dessin dans un ListItem, effets spéciaux).
-
Statiquestatic void drawRect(int x, int y, int w, int h, int color)Dessine un rectangle plein. Coordonnées en pixels écran.
-
Statiquestatic void drawRoundedRect(int x, int y, int w, int h, int radius, int color)Dessine un rectangle avec coins arrondis.
-
Statiquestatic void drawBorder(int x, int y, int w, int h, int thickness, int color)Dessine uniquement la bordure d'un rectangle (pas le remplissage).
-
Statiquestatic void drawCircle(int cx, int cy, int radius, int color)Dessine un cercle plein.
cx, cy= centre du cercle. -
Statiquestatic void drawGradient(int x, int y, int w, int h, int colorTop, int colorBottom)Dessine un rectangle avec un dégradé vertical de
colorTop(haut) àcolorBottom(bas). -
Statiquestatic void drawText(String text, int x, int y, int color, boolean shadow)Dessine du texte à la position donnée.
shadow=trueajoute une ombre portée. -
Statiquestatic void drawCenteredText(String text, int centerX, int y, int color, boolean shadow)Dessine du texte centré horizontalement autour de
centerX. -
Statiquestatic void enableScissor(int x, int y, int w, int h)Active le "scissor" (découpe) : tout ce qui est dessiné en dehors de cette zone est invisible. Parfait pour les zones scrollables.
-
Statiquestatic void disableScissor()Désactive le scissor — obligatoire après
enableScissor()pour ne pas affecter le reste du rendu.
Exemple : dessin personnalisé dans un ListItem
import fr.eri.eriapi.gui.util.RenderUtil;
import fr.eri.eriapi.gui.util.Colors;
@Override
public void render(int x, int y, int width, int height, int mouseX, int mouseY) {
// Fond de l'élément (légèrement plus clair au survol)
boolean hover = mouseX >= x && mouseX < x + width
&& mouseY >= y && mouseY < y + height;
RenderUtil.drawRect(x, y, width, height,
hover ? 0x1500DDFF : 0x08FFFFFF);
// Barre de couleur à gauche (style indicateur)
RenderUtil.drawRect(x, y, 4, height, Colors.CYAN);
// Avatar circulaire (cercle de couleur représentant le joueur)
int avatarX = x + 16 + (height / 2); // Centre X de l'avatar
int avatarY = y + (height / 2); // Centre Y de l'avatar
RenderUtil.drawCircle(avatarX, avatarY, height / 2 - 4, 0xFF4060FF);
// Initiale du nom sur l'avatar
String initiale = nomJoueur.substring(0, 1).toUpperCase();
RenderUtil.drawCenteredText(initiale, avatarX, avatarY - 5, Colors.WHITE, true);
// Nom du joueur
RenderUtil.drawText(nomJoueur, x + height + 12, y + 8, Colors.WHITE, false);
// Score à droite
RenderUtil.drawText(score + " pts", x + width - 70, y + 8, Colors.CYAN, false);
// Dégradé discret en bas de l'élément (séparateur)
RenderUtil.drawGradient(x, y + height - 1, width, 1,
Colors.withAlpha(Colors.WHITE, 20),
Colors.withAlpha(Colors.WHITE, 0));
}
SoundManager — Sons UI
SoundManager est un gestionnaire de sons UI utilisant les sons vanilla Minecraft.
Il permet de jouer des sons de clic, survol, toggle, focus, notification, etc.
Le volume global et la mise en sourdine sont configurables depuis n'importe quelle partie du code.
La plupart des composants jouent les bons sons sans configuration supplémentaire :
InteractiveComponent appelle playClick() au clic et playHover()
au survol, Checkbox et RadioButton appellent playToggle(),
TextField appelle playFocus(), et les notifications appellent
playNotification() à leur création. Utilise .sound(false) sur un composant
pour désactiver son son individuellement.
Sons pré-faits
| Méthode | Description | Son vanilla |
|---|---|---|
playClick() |
Clic de bouton | UI_BUTTON_CLICK |
playHover() |
Survol (pitch haut, volume bas) | UI_BUTTON_CLICK |
playFocus() |
Focus sur un champ de saisie | UI_BUTTON_CLICK |
playTick() |
Tick pendant un drag/slide | BLOCK_NOTE_HAT |
playSuccess() |
Validation réussie | ENTITY_EXPERIENCE_ORB_PICKUP |
playError() |
Erreur (note grave) | BLOCK_NOTE_BASS |
playNotification() |
Notification pop | BLOCK_NOTE_PLING |
playToggle() |
Toggle on/off (checkbox, radio) | UI_BUTTON_CLICK |
playOpen() |
Ouverture d'un panneau ou menu | UI_BUTTON_CLICK |
playClose() |
Fermeture d'un panneau ou menu | UI_BUTTON_CLICK |
Configuration globale
-
Statiquestatic void setMuted(boolean muted)Active ou désactive tous les sons UI globalement. Quand
true, aucun son ne sera joué par aucun composant. -
Statiquestatic void toggleMute()Bascule l'état mute/unmute. Équivalent à
setMuted(!isMuted()). -
Statiquestatic void setVolume(float volume)Règle le volume global des sons UI. Valeur entre
0.0(silencieux) et1.0(volume maximum). La valeur est appliquée à tous les sons joués par le SoundManager. -
Statiquestatic void play(SoundEvent event, float volume, float pitch)Joue un son vanilla personnalisé avec le volume et le pitch spécifiés. Respecte le mute global et le volume global.
Exemple d'utilisation
import fr.eri.eriapi.gui.util.SoundManager;
import net.minecraft.init.SoundEvents;
// --- Configuration globale ---
SoundManager.setMuted(true); // Désactiver tous les sons UI
SoundManager.setMuted(false); // Les réactiver
SoundManager.setVolume(0.5f); // Volume global à 50%
SoundManager.toggleMute(); // Basculer mute/unmute
// --- Son vanilla personnalisé ---
SoundManager.play(SoundEvents.ENTITY_EXPERIENCE_ORB_PICKUP, 0.6f, 1.2f);
// --- Désactiver le son sur un composant spécifique ---
new Button("Silencieux", 100, 50, 120, 30)
.sound(false) // Ce bouton ne jouera aucun son
.onClick(() -> doSomething());
Dropdown
Un Dropdown (ou "select") permet au joueur de choisir une valeur parmi une liste deroulante.
Il supporte la recherche filtrante et le scroll quand la liste est longue.
Exemple
import fr.eri.eriapi.gui.components.Dropdown;
// new Dropdown(x, y, width, height)
Dropdown dd = new Dropdown(660, 400, 300, 40)
.placeholder("Choisir un rang...")
.searchable(true)
.maxVisibleItems(8)
.onChange(val -> applyRank(val));
dd.addOption("Membre", "member");
dd.addOption("Officier", "officer");
dd.addOption("Chef", "leader");
root.add(dd);
-
MethodeaddOption(String label, String value)Ajoute une entree dans la liste deroulante.
labelest le texte affiche,valueest la valeur retournee pargetSelected(). -
FluentsetSelected(String value)Selectionne programmatiquement une entree par sa valeur. Si la valeur n'existe pas, l'etat retombe sur le placeholder.
-
GetterString getSelected()Retourne la valeur actuellement selectionnee, ou
nullsi rien n'est selectionne. -
EvenementonChange(Consumer<String> callback)Appele chaque fois que la selection change. Recoit la nouvelle valeur selectionnee.
-
Fluentplaceholder(String text)Texte affiche quand aucune valeur n'est selectionnee (ex : "Choisir..."). Grise et en italique.
-
FluentmaxVisibleItems(int n)Nombre maximum d'entrees visibles avant que la liste devienne scrollable. Defaut : 6.
-
Fluentsearchable(boolean enabled)Active un champ de recherche en haut de la liste deroulante. Le texte tape filtre les entrees en temps reel.
Rendu differe (deferred rendering)
Le Dropdown utilise un rendu differe : sa liste est dessinee APRES tous les autres
composants, garantissant qu'elle apparait toujours par-dessus. Le clic sur la liste fonctionne
meme quand le Dropdown est a l'interieur d'un ScrollPanel.
Si vous utilisez EriGuiScreen, tout est automatique. En revanche, si vous
surchargez drawScreen() ou mouseClicked() sans appeler super,
vous devez ajouter manuellement ces appels :
-
Staticstatic void Dropdown.renderDeferredDropdown()Dessine la liste deroulante ouverte. Appele automatiquement par
EriGuiScreen.drawScreen()apres le rendu du root. A appeler manuellement uniquement si vous surchargezdrawScreen()sanssuper. -
Staticstatic boolean Dropdown.handleDeferredClick(int mouseX, int mouseY, int mouseButton)Gere le clic sur la liste deroulante ouverte. Appele automatiquement par
EriGuiScreen.mouseClicked()avant le clic du root. Retournetruesi le clic a ete consomme. A appeler manuellement uniquement si vous surchargezmouseClicked()sanssuper. -
Staticstatic void Dropdown.resetState()Reinitialise l'etat interne du Dropdown (ferme la liste). Appele automatiquement par
EriGuiScreen.onGuiClosed(). A appeler manuellement si vous gerez la fermeture du GUI vous-meme.
ToggleSwitch
Un ToggleSwitch est un interrupteur ON/OFF visuel — l'equivalent moderne d'une Checkbox,
avec une pastille qui glisse. Ideal pour activer ou desactiver une option de facon claire.
Exemple
import fr.eri.eriapi.gui.components.ToggleSwitch;
// new ToggleSwitch(x, y, width, height)
ToggleSwitch toggle = new ToggleSwitch(860, 500, 60, 30)
.label("Afficher HUD Mana")
.setState(true)
.activeColor(0xFF00E5FF)
.onToggle(on -> manaBarMod.setEnabled(on));
root.add(toggle);
// Lire l'etat depuis un autre composant :
boolean actif = toggle.getState();
-
FluentsetState(boolean state)Definit l'etat initial ou programmatique du switch.
true= active (pastille a droite),false= inactif. -
Getterboolean getState()Retourne l'etat actuel du switch.
-
EvenementonToggle(Consumer<Boolean> callback)Appele chaque fois que l'utilisateur bascule le switch. Recoit le nouvel etat (
true= active). -
Fluentlabel(String text)Texte affiche a droite du switch. Cliquer sur le label bascule egalement le switch.
-
FluentactiveColor(int argb)Couleur de fond de la piste quand le switch est actif. Defaut : cyan (
0xFF00E5FF). -
FluentinactiveColor(int argb)Couleur de fond de la piste quand le switch est inactif. Defaut : gris sombre.
Modal / Dialog
Modal est une boite de dialogue superposee. Elle affiche un fond sombre semi-transparent
derriere un panneau central "liquid glass", avec une animation fade + scale a l'ouverture.
La touche Echap ferme automatiquement le modal.
Methodes statiques
-
Statiquestatic void Modal.confirm(String title, String msg, Runnable onConfirm, Runnable onCancel)Affiche un dialog de confirmation avec deux boutons : "Confirmer" (vert) et "Annuler" (gris). Appelle
onConfirmouonCancelselon le choix. -
Statiquestatic void Modal.alert(String title, String msg, Runnable onClose)Affiche un dialog d'alerte avec un seul bouton "OK". Appelle
onClosea la fermeture (bouton ou Echap). -
Statiquestatic ContainerComponent Modal.custom(String title, int width, int height)Cree un modal vide et retourne son
ContainerComponentinterne. Tu peux y ajouter n'importe quel composant pour personnaliser entierement le contenu.
Exemple
import fr.eri.eriapi.gui.components.Modal;
// Dialog de confirmation — action irreversible
Modal.confirm(
"Dissoudre la faction ?",
"Cette action est irreversible. Tous les membres seront exclus.",
() -> factionManager.dissolve(player), // Confirmer
() -> {} // Annuler (ne rien faire)
);
// Dialog d'alerte simple
Modal.alert(
"Permission refusee",
"Vous n'avez pas les droits pour effectuer cette action.",
() -> {}
);
// Modal personnalise avec des composants libres
ContainerComponent content = Modal.custom("Parametres avances", 600, 400);
content.add(new Label(20, 20, 560, 30, "Choisissez une option :"));
content.add(new Dropdown(20, 60, 560, 40)
.addOption("Option A", "a")
.addOption("Option B", "b"));
Tous les modals partagent le meme style : fond overlay 0x80000000, panneau liquid glass translucide,
animation fadeIn + scaleIn a l'ouverture, fermeture par Echap ou bouton.
PlayerHead
PlayerHead rend la tete 3D d'un joueur directement dans un GUI — skin complet avec couche
chapeau, orientation configurable. Utile pour les profils, les classements, les previews de membres.
Exemple
import fr.eri.eriapi.gui.components.PlayerHead;
import com.mojang.authlib.GameProfile;
// A partir d'un GameProfile (joueur connecte)
PlayerHead head = new PlayerHead(860, 300, 80, player.getGameProfile())
.setRotation(-20f, 15f) // yaw, pitch
.showHat(true);
root.add(head);
// A partir d'un UUID (joueur hors-ligne / stocke)
UUID uuid = UUID.fromString("069a79f4-44e9-4726-a5be-fca90e38aaf5"); // Notch
PlayerHead headByUuid = new PlayerHead(960, 300, 80, uuid)
.showHat(false);
-
ConstructeurPlayerHead(int x, int y, int size, GameProfile profile)Cree un rendu de tete a partir d'un
GameProfile. Le skin est charge automatiquement. -
ConstructeurPlayerHead(int x, int y, int size, UUID uuid)Cree un rendu de tete a partir d'un UUID. Le skin est recupere de facon asynchrone.
-
FluentsetProfile(GameProfile profile)Change le profil rendu (utile pour les listes dynamiques).
-
FluentsetRotation(float yaw, float pitch)Oriente la tete en degres. Yaw = rotation gauche/droite, pitch = haut/bas. Ex :
(-20f, 15f)pour un angle tres-quart de face. -
FluentshowHat(boolean enabled)Affiche ou cache la seconde couche du skin (chapeau, accessoires). Defaut :
true.
ItemStackRenderer
ItemStackRenderer rend un ItemStack Minecraft (avec son modele, ses enchantements
brillants, son compteur de stack et son tooltip) directement dans un GUI EriAPI.
Exemple
import fr.eri.eriapi.gui.components.ItemStackRenderer;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
// new ItemStackRenderer(x, y, size, stack)
ItemStackRenderer renderer = new ItemStackRenderer(
900, 400, 32, new ItemStack(Items.DIAMOND_SWORD))
.showTooltip(true) // Affiche le tooltip vanilla au survol
.showCount(false) // Cache le numero de stack
.scale(1.5f); // Agrandit l'icone de 50%
root.add(renderer);
// Changer l'item dynamiquement (ex : inventaire)
renderer.setStack(player.getHeldItemMainhand());
-
FluentsetStack(ItemStack stack)Remplace l'ItemStack rendu. Peut etre appele a chaque tick pour un rendu dynamique.
-
FluentshowTooltip(boolean enabled)Affiche le tooltip vanilla (nom, lore, enchantements) quand la souris survole le composant. Defaut :
true. -
FluentshowCount(boolean enabled)Affiche le texte du nombre d'items en superposition (coin bas-droit). Defaut :
true. Independant deshowDurability()— vous pouvez cacher le compteur tout en gardant la barre de durabilite. -
FluentshowDurability(boolean enabled)Affiche la barre de durabilite sous l'icone (pour les items avec durabilite). Defaut :
true. Independant deshowCount()— par exemple,showCount(false).showDurability(true)affiche la barre de durabilite sans le texte du compteur. -
Fluentscale(float factor)Facteur de mise a l'echelle de l'icone.
1.0f= taille normale (16x16),2.0f= double. Defaut :1.0f.
ItemSlot
ItemSlot est un composant de slot d'inventaire Minecraft avec interactions vanilla completes :
curseur partagé, drag-and-drop, shift+clic, double-clic. Il reproduit fidelement le comportement
de GuiContainer tout en s'integrant dans n'importe quel EriGuiScreen.
Le composant supporte trois modes distincts selon l'architecture du GUI (client-only, server-authoritative ou prise directe).
Exemple — inventaire client simple
import fr.eri.eriapi.gui.components.ItemSlot;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
// Slot vide interactif
ItemSlot slot = new ItemSlot()
.originalPos(100, 100)
.originalSize(48, 48)
.onSlotChanged((s, stack) -> System.out.println("Contenu : " + stack.getDisplayName()));
// Slot pre-rempli avec un diamant
ItemSlot slotDia = new ItemSlot(new ItemStack(Items.DIAMOND, 32))
.originalPos(160, 100)
.originalSize(48, 48)
.slotId("chest:0") // identifiant logique pour le serveur
.onSlotChanged((s, stack) -> saveToServer(stack))
.onShiftClick((s, stack) -> transferToPlayer(stack));
root.add(slot, slotDia);
Exemple — mode server-only (inventaire serveur)
// Tous les slots ciblent le serveur — aucune manipulation locale
for (int i = 0; i < 27; i++) {
final int idx = i;
ItemSlot slot = new ItemSlot()
.originalPos(80 + (i % 9) * 54, 200 + (i / 9) * 54)
.originalSize(48, 48)
.serverOnly(true) // mode server-authoritative
.slotId("chest:" + idx) // identifiant envoye au serveur dans le drag callback
.onAnyClick((s, button) -> {
// Appele pour chaque clic simple. button : 0=gauche, 1=droit, 2=shift+gauche
sendClickPacket(idx, button, ItemSlot.getCursorStack());
})
.onDoubleClick((s, type) -> {
// type 0 = double-clic collecte, type 3 = shift+double-clic
sendDoubleClickPacket(idx, type);
});
root.add(slot);
}
// Enregistrer le callback de drag (un seul, global)
ItemSlot.setServerDragCallback((button, targetSlotIds) -> {
sendDragPacket(button, targetSlotIds);
});
Exemple — mode takeOnly (vitrine)
// Le joueur peut prendre l'item mais pas en deposer d'autre
ItemSlot vitrine = new ItemSlot(new ItemStack(Items.DIAMOND_SWORD))
.originalPos(200, 300)
.originalSize(48, 48)
.takeOnly(true)
.onSlotChanged((s, taken) -> giveTo(player, taken));
Comportement des clics (mode normal)
| Action | Comportement |
|---|---|
| Clic gauche — curseur vide | Ramasse tout le contenu du slot dans le curseur |
| Clic gauche — curseur rempli | Depose / fusionne / echange avec le slot |
| Clic droit — curseur vide | Ramasse la moitie du stack |
| Clic droit — curseur rempli | Depose un seul item dans le slot |
| Shift + clic gauche | Declenche onShiftClick (transfer en masse deleguee) |
| Drag gauche | Distribue le curseur equitablement entre les slots survoles |
| Drag droit | Depose 1 item par slot survole |
| Double-clic gauche | Declenche onDoubleClick (type 0 — collecte tous les identiques) |
| Shift + double-clic | Declenche onDoubleClick (type 3 — transfure tous les identiques) |
Flux server-only — une seule action par clic physique
En mode serverOnly, aucune action n'est fired a mouseDown. Toute la logique
est decidee a mouseUp (via onDragEnd()) : si des slots de drag ont ete
accumules, c'est un drag — sinon c'est un clic simple. Un seul callback est toujours declenche,
jamais deux.
-
ConstructeurItemSlot()Cree un slot vide.
-
ConstructeurItemSlot(ItemStack stack)Cree un slot pre-rempli avec l'ItemStack fourni.
-
Fluentstack(ItemStack s)Definit ou remplace l'ItemStack du slot. Passe
nullpour vider le slot. -
Fluentinteractive(boolean b)Active ou desactive les interactions. Un slot non-interactif est rendu mais ne repond pas aux clics. Defaut :
true. -
FluenttakeOnly(boolean b)Mode prise directe — un clic prend l'item sans passer par le curseur. Le joueur ne peut pas deposer d'item dans ce slot.
-
FluentserverOnly(boolean b)Mode server-authoritative — aucune manipulation locale. Les clics et drags sont deleguees aux callbacks, le serveur repond avec le nouvel etat. Active automatiquement
interactive(true). -
FluentslotId(String id)Identifiant logique du slot (ex. :
"chest:5","player:12"). Utilise par le drag server-only pour identifier les slots dans le packet envoye au serveur. -
Fluentfilter(Predicate<ItemStack> f)Filtre les items acceptes. Retourner
falsebloque le depot de l'item dans ce slot. -
FluentbgColor(int color)Couleur de fond du slot au repos (ARGB). Defaut :
0x20FFFFFF. -
FluenthoverColor(int color)Couleur de fond au survol de la souris (ARGB). Defaut :
0x40FFFFFF. -
FluentslotBorderColor(int color)Couleur de la bordure du slot (ARGB). Mettre
0pour supprimer la bordure. Defaut :0x15FFFFFF. -
FluentcornerRadius(int r)Rayon des coins arrondis en pixels de design. Defaut :
4. -
FluentonSlotChanged(SlotAction action)Callback appele quand le contenu du slot change. Recoit le slot et la nouvelle ItemStack (vide si slot vide). Signature :
(ItemSlot slot, ItemStack stack) -> void. -
FluentonShiftClick(SlotAction action)Callback appele sur Shift+clic gauche. Recoit le slot et son ItemStack actuel. Utilise pour implementer le transfer en masse (ex. : coffre → inventaire joueur).
-
FluentonRightClick(SlotAction action)Callback appele sur clic droit quand le curseur est vide (ramassage de la moitie).
-
FluentonAnyClick(ClickAction action)Callback generique appele sur n'importe quel clic simple en mode
serverOnly. Signature :(ItemSlot slot, int button) -> void.buttonvaut 0 (gauche), 1 (droit) ou 2 (shift+gauche). -
FluentonDoubleClick(DoubleClickAction action)Callback appele sur double-clic gauche en mode
serverOnly. Signature :(ItemSlot slot, int type) -> void.typevaut 0 (collecte) ou 3 (Shift+double-clic transfer).
Methodes statiques
-
StatiqueItemSlot.getCursorStack()Retourne l'ItemStack actuellement tenu par le curseur (partage entre tous les slots du GUI).
-
StatiqueItemSlot.setCursorStack(ItemStack s)Force le contenu du curseur (utile pour appliquer la reponse serveur).
-
StatiqueItemSlot.clearCursor()Vide le curseur et reinitialise toute l'etat de drag. Appele automatiquement par
EriGuiScreen.onGuiClosed(). -
StatiqueItemSlot.renderCursorItem(int mouseX, int mouseY)Rend l'item tenu par le curseur a la position de la souris. Appele automatiquement par
EriGuiScreen.drawScreen()apres tous les composants. -
StatiqueItemSlot.setServerDragCallback(ServerDragCallback cb)Enregistre le callback de drag global pour le mode server-only. Signature :
(int button, List<String> targetSlotIds) -> void. Un seul callback suffit pour tout le GUI. -
StatiqueItemSlot.onDragEnd()Finalise le drag en cours et fire les callbacks appropries. Appele automatiquement par
EriGuiScreen.mouseReleased(). Ne jamais appeler manuellement.
EriGuiScreen integre automatiquement le cycle de vie des ItemSlot :
drawScreen() appelle renderCursorItem() apres tous les composants,
mouseReleased() appelle onDragEnd() avant la propagation aux composants,
mouseClickMove() propage checkDragHover() a chaque slot de l'arbre,
et onGuiClosed() appelle clearCursor(). Tu n'as rien a brancher manuellement.
L'item est automatiquement mis a l'echelle via GL pour remplir la zone du slot. Tu peux utiliser un slot de 32x32, 48x48 ou 64x64 design-pixels — l'icone s'adapte toujours proprement, independamment de la resolution reelle de l'ecran.
TexturedRect
TexturedRect rend une texture PNG (via ResourceLocation) dans les bornes
du composant. Il supporte une teinte de couleur, un mode niveaux de gris et un rendu sous-pixel
via le Tessellator pour des coordonnees virgule flottante precises.
Fonctionne aussi bien dans un EriGuiScreen que dans un OverlayMod.
Exemple
import fr.eri.eriapi.gui.components.TexturedRect;
import net.minecraft.util.ResourceLocation;
// Icone 64x64 en couleur
TexturedRect icon = new TexturedRect(
new ResourceLocation("eriniumfaction", "textures/gui/faction_icon.png"))
.originalPos(40, 40)
.originalSize(64, 64)
.tint(0xFFFFFFFF); // blanc = pas de teinte
root.add(icon);
// Icone desaturee (niveaux de gris) pour un element inactif
TexturedRect iconGray = new TexturedRect(
new ResourceLocation("eriniumfaction", "textures/gui/faction_icon.png"))
.originalPos(120, 40)
.originalSize(64, 64)
.grayscale(true);
root.add(iconGray);
// Teinte coloree semi-transparente
TexturedRect tinted = new TexturedRect(
new ResourceLocation("eriniumfaction", "textures/gui/banner.png"))
.originalPos(0, 0)
.originalSize(1920, 1080)
.tint(0x80FF6600) // orange 50% transparent
.textureSize(256, 128); // taille reelle de l'image PNG
root.add(tinted);
// Mettre a jour dynamiquement
icon.setGrayscale(true);
icon.setTint(0x80FFFFFF);
-
ConstructeurTexturedRect(ResourceLocation texture)Cree un composant qui rend la texture PNG specifiee. La texture doit etre dans le classpath du mod (dossier
assets/). -
Fluenttexture(ResourceLocation tex)Remplace la texture rendue. Peut etre appele dynamiquement pour changer l'image affichee.
-
Fluenttint(int color)Applique une teinte ARGB sur la texture.
0xFFFFFFFF= aucune teinte (defaut). L'alpha de la teinte multiplie l'opacite du composant. -
Fluentgrayscale(boolean gray)Active le rendu en niveaux de gris (applique une couleur neutre
(0.35, 0.35, 0.35)). Utile pour des elements desactives ou des icones inactives. Defaut :false. -
FluenttextureSize(int w, int h)Declare la resolution reelle de l'image PNG (en pixels). Informe le moteur de rendu sur les proportions UV de la texture. Defaut :
64x64. -
SettersetGrayscale(boolean g)Equivalent non-fluent de
grayscale()— utile pour basculer le mode depuis un callback. -
SettersetTint(int c)Equivalent non-fluent de
tint()— utile pour animer la teinte depuis unonColorUpdate(). -
GettergetTexture()Retourne la
ResourceLocationde la texture actuellement affichee.
TexturedRect utilise le Tessellator avec des coordonnees float
pour un positionnement sub-pixel precis. Contrairement a Gui.drawTexturedModalRect()
qui arrondit aux entiers, ce composant s'aligne parfaitement avec le ScaleManager meme
aux echelles non-entieres.
Divider
Un Divider est une ligne de separation horizontale ou verticale. Il peut etre uni,
avec un degrade ou avec des marges, et s'integre dans n'importe quel panneau pour separer visuellement
des sections.
Exemple
import fr.eri.eriapi.gui.components.Divider;
// new Divider(x, y, length) — horizontal par defaut
root.add(new Divider(60, 200, 500)
.gradient(0x4400E5FF, 0x00000000) // Cyan vers transparent
.thickness(1)
.margin(20));
// Separateur vertical plein
root.add(new Divider(960, 100, 800)
.vertical()
.color(0x33FFFFFF)
.thickness(2));
-
Fluenthorizontal()Mode horizontal (defaut). Le parametre
lengthest la largeur. -
Fluentvertical()Mode vertical. Le parametre
lengthdevient la hauteur. -
Fluentcolor(int argb)Couleur unie de la ligne. Remplace tout degrade defini precedemment.
-
Fluentthickness(int px)Epaisseur de la ligne en pixels design. Defaut :
1. -
Fluentgradient(int startColor, int endColor)Applique un degrade lineaire de
startColoraendColorle long de la ligne. Remplace la couleur unie. -
Fluentmargin(int px)Espace vide (transparent) au debut et a la fin de la ligne. Utile pour laisser de l'air par rapport aux bords du panneau.
Badge
Un Badge est une etiquette compacte de type "pilule" — parfait pour afficher des tags,
des grades, des statuts ou des categories (ex : "Combat", "Chef", "En ligne").
Exemple
import fr.eri.eriapi.gui.components.Badge;
// new Badge(x, y, text) — taille auto calculee depuis le texte
root.add(new Badge(200, 150, "Combat")
.color(0x206B2FA0, 0xFF9B4FCF) // (bgColor, textColor)
.outlined(true));
// Badge avec icone
root.add(new Badge(300, 150, "Chef")
.color(0x20FFD700, 0xFFFFD700)
.icon(new ResourceLocation("eriniumfaction", "textures/gui/icon_crown.png"))
.cornerRadius(4));
// Badge plein (non outlined)
root.add(new Badge(400, 150, "En ligne")
.color(0xFF1A6B3C, 0xFF2ECC71)
.scale(0.75f));
-
Fluentcolor(int bgColor, int textColor)Couleur de fond et couleur du texte en ARGB. Le fond accepte un alpha faible pour un effet translucide.
-
Fluentoutlined(boolean enabled)Mode contour : fond transparent, bordure coloree avec
bgColor. -
FluentcornerRadius(int px)Rayon des coins en pixels design. Defaut :
999(pilule parfaite). Mettre4pour un look rectangulaire arrondi. -
Fluenticon(ResourceLocation texture)Icone 16x16 affichee a gauche du texte. La largeur du badge s'ajuste automatiquement.
-
Fluentscale(float factor)Scale du texte du badge. Defaut :
0.8f. Diminuer pour les badges tres compacts.
Accordion
Un Accordion est une liste de sections repliables. Chaque section a un en-tete cliquable
qui deplie ou replie son contenu. L'option singleMode garantit qu'une seule section
est ouverte a la fois.
Exemple
import fr.eri.eriapi.gui.components.Accordion;
// new Accordion(x, y, width)
Accordion acc = new Accordion(660, 300, 600)
.singleMode(true); // Une seule section ouverte a la fois
acc.addSection("Informations", section -> {
section.add(new Label(10, 10, 580, 20,
"Nom : " + faction.getName()));
section.add(new Label(10, 35, 580, 20,
"Membres : " + faction.getMemberCount()));
});
acc.addSection("Statistiques", section -> {
section.add(new Label(10, 10, 580, 20,
"Victoires : " + faction.getWins()));
section.add(new Label(10, 35, 580, 20,
"Defaites : " + faction.getLosses()));
});
acc.addSection("Membres", section -> {
for (String member : faction.getMembers()) {
section.add(new Label(10, 10 + i * 25, 580, 20, member));
}
});
root.add(acc);
-
MethodeaddSection(String title, Consumer<ContainerComponent> builder)Ajoute une section avec l'en-tete
title. Le lambda recoit leContainerComponentde contenu — ajoute tes composants dedans. -
MethodeexpandAll()Deplie toutes les sections. Ignore
singleMode. -
MethodecollapseAll()Replie toutes les sections.
-
FluentsingleMode(boolean enabled)Quand actif, ouvrir une section ferme automatiquement toute autre section ouverte. Defaut :
false.
Carousel
Un Carousel affiche une serie de composants en les faisant defiler horizontalement.
Il supporte la navigation par fleches, des points indicateurs, et le defilement automatique.
Ideal pour des previews de cartes, de recompenses, ou de factions.
Exemple
import fr.eri.eriapi.gui.components.Carousel;
// new Carousel(x, y, width, height)
Carousel car = new Carousel(200, 300, 1520, 400)
.setVisibleCount(3) // 3 cartes visibles simultanement
.showArrows(true) // Boutons < et > de navigation
.showDots(true) // Points indicateurs en bas
.autoScroll(100); // Defilement auto toutes les 100 ticks (5 sec)
// Ajouter des items (n'importe quel Component)
for (FactionCard card : factionCards) {
ContainerComponent cardComp = new ContainerComponent(0, 0, 480, 380);
cardComp.add(new Rectangle(0, 0, 480, 380)
.fillColor(0xCC1A1A2E).cornerRadius(12));
cardComp.add(new Label(20, 20, 440, 30, card.getName())
.scale(2.0f).color(0xFFFFFFFF));
car.addItem(cardComp);
}
root.add(car);
-
MethodeaddItem(Component component)Ajoute un element au carousel. Chaque item est un
Componentquelconque — generalement unContainerComponent. -
FluentsetVisibleCount(int n)Nombre d'items affiches simultanement. L'espace disponible est divise equitablement. Defaut :
1. -
FluentshowArrows(boolean enabled)Affiche les boutons fleche gauche/droite sur les cotes du carousel.
-
FluentshowDots(boolean enabled)Affiche des points indicateurs en bas du carousel (un point par item, l'actif est mis en evidence).
-
FluentautoScroll(int intervalTicks)Active le defilement automatique toutes les
intervalTicksticks. Passer0pour desactiver.
ProgressBarEnhanced
ProgressBarEnhanced est une barre de progression avancee supportant 9 formes geometriques,
des degrades, des segments, des animations fluides et un label centre. Utilise-la a la place du
ProgressBar classique quand tu as besoin de rendu circulaire, hexagonal, ou segmente.
Formes disponibles — enum BarShape
| Constante | Rendu | Usage typique |
|---|---|---|
| BarShape.HORIZONTAL | Barre gauche-droite | XP, vie, mana |
| BarShape.VERTICAL | Barre bas-haut | Niveau d'eau, chaleur |
| BarShape.CIRCULAR | Anneau (arc) | Cooldown, endurance |
| BarShape.PIE | Camembert rempli | Part de ressource |
| BarShape.DIAMOND | Losange | Stats PvP |
| BarShape.PENTAGON | Pentagone | Score global |
| BarShape.HEXAGON | Hexagone | Capacites, rang |
| BarShape.OCTAGON | Octogone | Bouclier, defense |
| BarShape.SQUARE | Carre avec coins | Barre compacte |
Sens de remplissage — enum FillDirection
| Constante | Sens |
|---|---|
| FillDirection.LEFT_TO_RIGHT | De gauche a droite (defaut horizontal) |
| FillDirection.RIGHT_TO_LEFT | De droite a gauche |
| FillDirection.BOTTOM_TO_TOP | De bas en haut (defaut vertical) |
| FillDirection.TOP_TO_BOTTOM | De haut en bas |
| FillDirection.CLOCKWISE | Sens horaire (formes circulaires) |
| FillDirection.COUNTERCLOCKWISE | Sens anti-horaire |
Exemples
import fr.eri.eriapi.gui.components.ProgressBarEnhanced;
import fr.eri.eriapi.gui.components.ProgressBarEnhanced.BarShape;
import fr.eri.eriapi.gui.components.ProgressBarEnhanced.FillDirection;
// Anneau circulaire pour un cooldown
ProgressBarEnhanced ring = new ProgressBarEnhanced(860, 440, 200, 200)
.shape(BarShape.CIRCULAR)
.value(0.72f)
.barWidth(18)
.gradientFill(0xFF00E5FF, 0xFF6B2FA0)
.backgroundColor(0xFF1A1A2E)
.showPercentage(true)
.animate(true);
root.add(ring);
// Barre XP segmentee style old-school
ProgressBarEnhanced bar = new ProgressBarEnhanced(100, 50, 400, 20)
.shape(BarShape.HORIZONTAL)
.value(0.5f)
.segments(10)
.segmentGap(2)
.fillColor(0xFF00D4FF)
.cornerRadius(4)
.animate(true)
.animationSpeed(10); // Transition en 10 ticks (0.5 sec)
root.add(bar);
-
Fluentshape(BarShape shape)Definit la forme geometrique de la barre. Voir le tableau
BarShapeci-dessus. -
Fluentvalue(float v)Valeur de remplissage entre
0.0(vide) et1.0(plein). Sianimateest actif, la transition est animee. -
FluentfillColor(int argb)Couleur unie du remplissage. Remplace tout degrade defini.
-
FluentbackgroundColor(int argb)Couleur de la zone vide (fond de la barre).
-
FluentbarWidth(int px)Epaisseur de l'anneau ou du contour pour les formes circulaires et polygonales.
-
FluentgradientFill(int startColor, int endColor)Degrade lineaire du remplissage. Pour CIRCULAR/PIE, le degrade suit l'arc.
-
Fluentsegments(int n)Divise la barre en
nsegments separes. Tres utile pour les barres de vie style jeu de roles. -
FluentsegmentGap(int px)Espacement en pixels design entre les segments.
-
Fluentdirection(FillDirection dir)Sens de remplissage. Voir le tableau
FillDirectionci-dessus. -
Fluentanimate(boolean enabled)Active les transitions animees lors des changements de valeur via
value(). -
FluentanimationSpeed(int ticks)Duree de la transition en ticks. Defaut :
10(0.5 sec). Necessiteanimate(true). -
FluentshowPercentage(boolean enabled)Affiche le pourcentage ("72%") au centre du composant.
-
Fluentlabel(String text)Texte centre affiche en superposition. Remplace le pourcentage si
showPercentageest aussi actif. -
FluentcornerRadius(int px)Rayon des coins pour les formes HORIZONTAL, VERTICAL et SQUARE.
GUI Showcase — Page 2 : Textures
La GUI de démonstration (ouverte via /skyapitest) possède désormais
deux pages de contenu, accessibles grâce aux boutons de navigation dans le header :
- Components — Tous les composants habituels (boutons, inputs, charts, ColorPicker, etc.)
- Textures — Démo du support texture pour ProgressBar, Slider, Checkbox, ScrollPanel, ScrollList, TabView, ContextMenu et Notification.
Les boutons "Components" et "Textures" dans le bandeau supérieur de la GUI showcase permettent de passer d'une page à l'autre. La page active est mise en évidence par la couleur du bouton.