GuiAPI



  • Bonjour, ce topic aura pour objectif d'introduire la GuiAPI, ses possibilités ainsi que son mode d'emploi.

    #Quel est but de la GuiAPI ?(Quel est but de la GuiAPI ?)

    Son but principal est de simplifier la création d'interfaces dans le jeu. Afin de réduire le temps (gâché) passé à mettre en place une classe et un rendu de GUI.
    J'en ai eu assez de trifouiller des classes entières afin de créer un GUI potable (réécrire les mêmes lignes pour mettre à jour tous les composants, etc), de là est née l'idée de cette API. A présent vous pouvez créer un GUI et y ajouter des composants, plus ou moins complexes, en quelques lignes.

    De plus, j'ai rapidement trouvé que les GUIs de Minecraft Vanilla manquaient de composants, ou ces derniers ne sont tout simplement pas assez modulables (exemple des sliders difficilement intégrables en tant que tel, ou les boutons qui ne peuvent pas être plus grand que 200x20, etc.).

    #Quels sont les ajouts que proposent l'API ?(Quels sont les ajouts que proposent l'API ?)

    Premièrement, et c'est l'élément crucial de l'API: elle gère "l'inception", dirons nous, un composant dans un composant dans un composant, etc.


    A quoi diable cela sert-il ? Et bien, à la façon de Java Swing, vous pouvez créer des panels, y ajouter des composants (qui seront mis à jour automatiquement, plus besoin de rajouter toutes ces lignes redondantes, idem pour le rendu). Vous pourrez par conséquent gérer facilement des ensembles de composants au lieu de les gérer individuellement! Simplicité quand tu nous tiens! Un système interne au rendu permet également aux composants enfants des panels de n'être rendu que dans les limites de ce dernier (vous comprendrez plus bas).

    Afin de gérer les inter compatibilités entre les mods qui utiliseraient l'API, j'ai également mis en place différents events, chacun cancelable, pour modifier des GUIs de mods externes.

    Je pense qu'à ce stade des screens et exemples concrets seront plus parlant pour montrer les ajouts:


                                               (Panel 1 et Panel 2 visibles)                                                             (En une ligne de code, tout l'ensemble du Panel 2 est invisible)

    Pour voir le code de ce GUI, c'est ici. Ce GUI regroupe quelques composants compris dans l'API, en voici la liste complète à ce jour:
    Les conteneurs:

    • [color=#333333La ]frame%(#333333)[, c'est le composant père par excellence, il constitue la base du GUI.
    • Le panel], il s'agit d'un conteneur basique.
    • Le [color=#33cc33**scroll pane **]est un fils de panel qui, s'il contient un composant/conteneur plus grand que lui-même, permet, à l'aide de sliders, de bouger à travers ce GUI.
    • Le container, il est lié à une classe Container et permet ainsi l'interaction avec l'inventaire d'un coffre, joueur, etc. Il crée automatiquement les slots qui le compose.
      Les composants:
    • Les **boutons **(+ icônes, + toutes tailles disponibles).
    • Le text area (celui en haut à droite), il peut être redimensionné (spécification d'un minWidth, maxWidth, minHeight, maxHeight), il contient un "hint text" (texte qui disparait à l'écriture et sert d'indicateur au contenu à entrer). Il contient également un système de regex afin de contrôler les caractères entrés dans ce dernier, y compris des patterns (ex: ((\d)[h)?((\d)[m])?((\d)~~)?] **est un regex permettant de n'entrer qu'un string respectant la forme d'un horaire "*hms"). La taille maximum d'une ligne et du nombre de caractère peut également être réglée.
            - Le **text field **et le **password field **sont des enfants du text area, et ont donc les mêmes propriétés, les seules différences: ils ne sont constitués que d'une ligne maximum de texte, ne sont pas redimensionnables, et dans le cas du password field le texte est remplacé par des ****.[color=#333333
    • L'entity render], %(#333333)[il s'agit d'un composant permettant de faire le rendu d'une entité.
    • La check box], elle peut être cochée ou décochée, rien de bien fou 🙂
    • La progress bar, elle est customisable, on peut choisir son minimum, maximum, gérer sa progression, lui donner une texture vide, pleine, ou juste une couleur.
    • Le slider, de la même manière que la progress bar, son minimum/maximum est réglable, ainsi que son "cran d'incrémentation".
    • Le slot, il est ajouté automatiquement à un gui container.

    Je pense avoir fait le tour pour le moment, dans un futur proche je ferai une mise à jour afin de rajouter d'autres éléments, dont voici une liste non exhaustive:

    • Gestion des GuiOverlay
    • Amélioration des GuiContainer, notamment en permettant la création de slots plus originaux (différentes tailles, action lors du hovering, etc)
    • Ajout du repère orthonormé, qui permettra de faire le rendu de courbes représentatives de fonctions
    • Ajout de GUIs basiques tels que:
             - Une liste
             - Un choix multiple (Oui / Non, ou autre)

    Toute suggestion est bien évidemment la bienvenue 😄

    #Code source et téléchargement(Code source et téléchargement)

    Cette API est bien évidemment open-source, j'attends d'ailleurs vos potentiels retours sur mon code (mon objectif étant de m'améliorer rapidement donc n'hésitez pas à critiquer ^^).

    Github
    Téléchargement

    Sur ce, bonne journée/soirée ;)~~


  • Modérateurs

    Tout d'abord, très beau travail! Minecraft manquait effectivement de solutions pour faire des GUIs propres et portables!

    J'aurais juste quelques remarques à faire sur le code:

    • Mouse::getDWheel(), fais très attention en utilisant cette méthode, elle donne le changement en position de la molette de la souris depuis le dernier appel de Mouse::getDWheel(). Ça peut potentiellement poser problème si cette méthode est appelée à plusieurs endroits différents. (je pense à tes potentiels GuiOverlay qui pourraient interférer avec la 'hotbar')
    • Ton code dépend encore beaucoup sur certaines classes du jeu, ce qui peut rendre compliqué le passage d'une version à une autre. Mais je ne pense pas que ce soit un gros problème puisque ce sont des classes qui ont peu de chance de changer.
    • Et le meilleur pour la fin: il y a beaucoup de documentation! C'est une bonne initiative!


  • Merci pour ton retour, je vais trouver une alternative au dWheel prochainement dans ce cas 🙂 Concernant les dépendances au code Minecraft, tu penses à des classes précises ? Parce que les seules encore fortement dépendantes restent celles des containers que je compte modifier dans une version future, pour le moment elles restent des copiés/collés légèrement modifiés des classes de Minecraft.


  • Modérateurs

    Après revérification, il y a moins de dépendances que ce que je me souvenais. Je noterais peut-être juste la classe Minecraft (mais on peut pas trop faire sans) et 'PositionedSoundRecord' dans GuiButton et GuiSlider, mais je vois pas trop comment faire autrement au final.



  • D'accord 🙂 de toute manière, et comme tu la dis, ce sont des méthodes qui ne changeront pas.
    A ceux qui verront ce topic, je suis ouvert à toutes propositions d'ajouts a faire, alors n'hésitez pas 😉


  • Modérateurs

    Je proposerais bien des fenêtres internes, un peu comme ça:

    Et des barres de progression (avec possibilité de changer les couleurs si possible) et d'y ajouter du texte (peut-être utiliser GuiPanel ?):



  • Beau travail, ça a l'air d'être une API bien pratique, permettant plus de choses que le système de gui de MC, je regarderais plus en détail un peu plus tard mais ça m'intéresse.



  • Merci, tout ce que tu viens de citer est déjà possible 😉 il faut juste que je rajoute de quoi mettre un texte dans la barre de progression. 🙂



  • Petite mise à jour:

    • Patch correctif de quelques bugs (voir liste des commits).
    • Ajout du texte sur la barre de progression.
    • Amélioration du système de composants: on peut désormais en rajouter depuis n'importe qu'elle fonction, ce qui provoquait auparavant une ConcurrentModificationException dûe à la boucle for.
    • Modification de l'update de l'état survolé.
    • Changement du dWheel (getDWheel() -> getEventDWheel() pour éviter de remettre la valeur de dWheel à 0, merci à @jglrxavpok pour avoir révélé le problème potentiel)

  • Administrateurs

    Au début cette API me faisait penser à GuiAPI de ShockAhPi (MinecraftForum.net) ^^



  • Je ne connaissais pas, à en voir la version sur minecraftforum elle n'est plus à jour de toute manière ^^


  • Administrateurs

    Oui ça fait un bail que c'est abandonné. 😛



  • Ok donc je garde la légitimité de mon API, j'ai eu peur ^^'


  • Administrateurs

    Ce n'était pas ce que je sous-entendais dans mes messages haha 🙂
    Juste que le nom me faisait rappeler l'API de ShockAhPi ! 😉



  • D'accord 🙂
    Petit patch de la soirée:

    • Une boucle infinie était déclenchée si le maxLineLength du textArea n'était pas mis à jour.
    • Modification du lineScrollOffsetX pour voir au minimum un caractère dans les textArea (auparavant si on supprimait le texte visible on ne voyait pas le caractère que l'on supprimerait ensuite).
    • Modification du système de remplacement du texte pour les passwordField qui décalait la position calculée lors de la sélection du texte.
    • Ajout d'un paddingTop par défaut sur les textField pour avoir le texte centré.
    • Mise à jour de la position d'un composant en type de position relative lors de son redimensionnement.
    • Ajout de du paramètre backgroundTexture sur les boutons pour créer des boutons sans texture (uniquement une icone, ou du texte, ou les deux, par exemple).


  • Nouvelle mise à jour après un peu de temps ^^

    Les ajouts majeurs:

    • Ajout d'un design dit relatif ou responsive pour les habitués du CSS
    • Ajout des GuiList entièrement customisable, chaque sous-panel représentant une entrée peut être différent
    • Ajout de la GuiComboBox, de la même manière chaque entrée peut être customisée

    Ajouts mineurs:

    • Ajout du setCanLooseFocus pour empêcher ou non la perte du focus d'un élément lors d'un clic sur un panel différent
    • Amélioration du système de bordures (possibilité de la paramétrer en interne ou externe par rapport au composant)
    • Amélioration du système de layers, au clic d'un composant, ceux cachés derrière ne sont plus cliqués
    • Réglages de quelques bugs rencontrés (voir liste des commits)

    Je prévois de faire un article plus complet sur comment utiliser le mod et donner plus d'exemples de GUIs bien sympas histoire d'intéresser plus de monde 😉 Surement d'ici Pâques si je trouve le temps.