• Récent
  • Mots-clés
  • Populaire
  • Utilisateurs
  • Groupes
  • S'inscrire
  • Se connecter
  • S'inscrire
  • Se connecter
  • Recherche
  • Récent
  • Mots-clés
  • Populaire
  • Utilisateurs
  • Groupes

Modifier l'overlay (HUD) du jeu

Les interfaces (GUI) et les container
1.11.x
13
64
13.8k
Charger plus de messages
  • Du plus ancien au plus récent
  • Du plus récent au plus ancien
  • Les plus votés
Répondre
  • Répondre à l'aide d'un nouveau sujet
Se connecter pour répondre
Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
  • AymericRed
    AymericRed dernière édition par robin4002 29 nov. 2021, 00:36 23 juin 2017, 19:37

    Sommaire

    • Introduction
    • Pré-requis
    • Code
      • Classe de l’overlay
      • Retirer des éléments du HUD
      • Ajouter des éléments au HUD
      • Exemple
    • Résultat
    • Crédits

    Introduction

    Dans ce tutoriel vous allez apprendre à ajouter et retirer des éléments à/de l’overlay (ou HUD) de Minecraft.
    Etant donné qu’encore beaucoup de personnes l’utilisent (malheuresement), je précise que ce tutoriel marchera, à peu de choses près, en 1.7.10 (quelques changements de noms comme Gui.drawScaledCustomSizeModalRect qui devient Gui.func_152125_a mais à part ça rien de bien compliqué).

    Pré-requis

    Savoir utiliser les évènements

    Code

    Note : Pour enregistrer la classe d’évènements du HUD j’utilise l’annotation “@EventBusSubscriber(modid=TutorielMod.MODID, value={Side.CLIENT})” sur la classe, mais vous pouvez toujours l’enregistrer via la classe principale ou le proxy, comme présenté dans le tutoriel des pré-requis.

    Classe du HUD

    Vous pouvez utiliser une classe d’évènements existante ou en créer une, ce que je conseille pour avoir un code mieux organisé.
    ❗ Veillez bien à ce que la classe ne soit enregistrée que sur le client, comme c’est une classe qui touche au rendu, cela ferait crasher le serveur au lancement du jeu.

    Dans cette classe ajoutez les fonctions suivantes (à la fin du tutoriel vous n’aurez peut-être pas utilisé une des deux, vous pourrez l’enlever) :

    @SubscribeEvent
    public static void renderGameOverlayPre(RenderGameOverlayEvent.Pre event)
    {
    }
    @SubscribeEvent
    public static void renderGameOverlayPost(RenderGameOverlayEvent.Post event)
    {
    }

    Ensuite, tout va dépendre de ce que vous voulez faire :

    Retirer des éléments du HUD vanilla

    Ceci se fait dans la fonction “renderGameOverlayPre” (et pas renderGameOverlayPost car l’élément aura déjà été dessiné).
    Pour retirer une élément du HUD vanilla, c’est très simple, il suffit d’annuler l’évènement, mais attention, car il faut l’annuler seulement si c’est bien l’élément désiré, pour savoir quel élément est en train d’être dessiné, il suffit de faire

        if(event.getType().equals(ElementType.CEQUEVOUSVOULEZRETIRER))
    

    ce qui donnera

    if(event.getType().equals(ElementType.HEALTH))
    {
        event.setCanceled(true);
    }

    pour désactiver l’affichage de la vie.

    Je vous invite à regarder la classe ElementType pour voir tous les éléments modifiables.
    /!\ Si vous annulez “ElementType.ALL” plus rien ne sera affiché sur le HUD.

    Ajouter des éléments au HUD vanilla

    Cela doit être fait dans la fonction “renderGameOverlayPost”, pour éviter tout problème (par exemple couleur, lumière) par rapport aux éléments dessinés après l’appel de la fonction “renderGameOverlayPre”.
    Le code devra être placé dans un

        if(event.getType().equals(ElementType.ALL)) {}
    

    pour éviter qu’il ne soit appelé plusieurs fois par image dessinée.
    Maintenant je vais vous donner quelques fonctions utiles pour dessiner des choses sur le HUD mais ça restera à vous de faire le code (je ferais tout de même un exemple).

    • Pour obtenir les dimensions de la fenêtre, utilisez
        event.getResolution()
    

    cela peut permettre de dessiner en bas ou à droite de la fenêtre, à côté des ses bordures.

    • Pour dessiner un rectangle ayant la même texture que le rectangle affichant un score sur la droite avec le scoreboard :
        Gui.drawRect(x1, y1, x2, y2, Integer.MIN_VALUE);
    

    /!\ x2 et y2 ne représentent pas la largeur et la hauteur mais les coordonnées opposées du point (x1;y1) :

    (Ignorez x3,y3 et x4,y4).

    • Pour dessiner du texte vous pouvez utiliser
        MC.fontRendererObj.drawString(le texte, x, y, la couleur);
    

    Pour la couleur vous pouvez mettre une valeur hexadécimale ou alors simplement utiliser “Color.WHITE.getRGB()” (en changeant la couleur, Color appartient au package java.awt, n’utilisez pas les autres).
    ❗ “MC” correspond à une variable statique utilisée dans l’exemple, ajoutez “public static final Minecraft MC = Minecraft.getMinecraft();” en haut de votre classe.

    • Pour dessiner un rectangle avec une image, vous pouvez utiliser cette fonction :
      Gui.drawScaledCustomSizeModalRect(x, y, u, v, largeur sur l’image, hauteur sur l’image, largeur, hauteur, largeur du fichier de l’image, hauteur du fichier de l’image);

    Cette fonction prend 8 arguments qui sont :

    • x,y : coordonnées où l’image sera dessinée.
    • u,v : coordonnées de l’image dans son fichier.
    • largeur sur l’image,hauteur sur l’image : dimensions de l’image dans le fichier (pour ne pas dessiner la texture en entier, juste une partie).
    • largeur,hauteur : dimensions de l’image dessinée à l’écran (adaptées à la GuiScale choisie par le joueur).
    • largeur du fichier de l’image,hauteur du fichier de l’image : dimensions totales du fichier de l’image (même la partie qu’on ne dessine pas si il y en a).

    Si vous avez compris mes explications, vous comprendrez donc qu’il est facile de mettre plusieurs choses à dessiner dans un même fichier, et que l’on peut agrandir ou réduire une image par rapport à sa taille d’origine dans le fichier (en ayant des “largeur sur l’image” et “largeur” différents).
    (je vous laisse regarder la javadoc de cette fonction pour plus de détails sur son utilisation, en anglais).

    Exemple

    ❗ Je donne cette exemple pour vous montrer comment on peut utiliser ces différentes fonctions, mais ne le copiez collez pas sans le comprendre !

    package fr.mff.tutoriel;
    import java.awt.Color;
    import org.lwjgl.opengl.GL11;
    import net.minecraft.client.Minecraft;
    import net.minecraft.client.gui.Gui;
    import net.minecraft.client.gui.ScaledResolution;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.util.ResourceLocation;
    import net.minecraftforge.client.event.RenderGameOverlayEvent;
    import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType;
    import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
    import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
    import net.minecraftforge.fml.relauncher.Side;
    @EventBusSubscriber(modid = TutorielMod.ID, value = {Side.CLIENT})
    public class GameOverlayHandler
    {
        private static final ResourceLocation emptyLife = new ResourceLocation(TutorielMod.ID, "textures/gui/emptylife.png");
        private static final ResourceLocation fullLife = new ResourceLocation(TutorielMod.ID, "textures/gui/fulllife.png");
        public static final Minecraft MC = Minecraft.getMinecraft();
        @SubscribeEvent
        public static void renderGameOverlayPre(RenderGameOverlayEvent.Pre event)
        {
            if(event.getType().equals(ElementType.HEALTH))
                event.setCanceled(true);
        }
        @SubscribeEvent
        public static void renderGameOverlayPost(RenderGameOverlayEvent.Post event)
        {
            if(event.getType().equals(ElementType.ALL))
            {
                GL11.glColor4f(1, 1, 1, 1);
                GL11.glEnable(GL11.GL_BLEND);
                GL11.glBlendFunc(770, 771);
                int width = event.getResolution().getScaledWidth();
                if(!MC.player.capabilities.disableDamage)
                    drawHealth(event.getResolution(), MC.player);
                String s = MC.getConnection().getPlayerInfoMap().size() + "/" + MC.getConnection().currentServerMaxPlayers + " joueurs";
                Gui.drawRect(width - 5 - MC.fontRendererObj.getStringWidth(s), 2, width - 2, 4 + MC.fontRendererObj.FONT_HEIGHT, Integer.MIN_VALUE);
                MC.fontRendererObj.drawString(s, width - 3 - MC.fontRendererObj.getStringWidth(s), 4, Color.WHITE.getRGB());
            }
        }
        private static void drawHealth(ScaledResolution res, EntityPlayer player)
        {
            MC.getTextureManager().bindTexture(emptyLife);
            Gui.drawScaledCustomSizeModalRect(res.getScaledWidth() - 70, res.getScaledHeight() - 76, 0, 0, 64, 64, 64, 64, 64, 64);
            int percent = (int)(player.getHealth() * 64 / player.getMaxHealth());
            if(percent > 0)
            {
                MC.getTextureManager().bindTexture(fullLife);
                Gui.drawScaledCustomSizeModalRect(res.getScaledWidth() - 70, res.getScaledHeight() - 76 + (64 - percent), 0, 64 - percent, 64, percent, 64, percent, 64, 64);
            }
        }
    }

    Ceci permettra de ne pas dessiner la vie “vanilla” mais de dessiner notre propre icône (notez d’ailleurs que la texture utilisée fait du 64*64), et le nombre de joueurs en ligne est dessiné en haut à droite.

    Bonus

    Modifier l’overlay peut permettre différentes choses, en voici certaines avec une mini explication de comment faire, et des liens vers les tutoriels en rapport :

    • Créer une barre personnalisée, par exemple de soif ou de mana, pour faire ceci, vous devrez utiliser les capabilities.
    • Afficher un message personnalisé à partir d’une commande, pour le faire vous aurez besoin de ceci ainsi que ceci (nécessite un minimum de connaissances, maîtriser les packets n’est pas inné).
    • Vous pouvez proposer/demander d’autres choses dans les réponses au sujet 😉

    Résultat

    Voici le résultat de l’exemple donné dans le tutoriel, ce n’est bien sur qu’un exemple assez simple, on peut faire bien plus pour modifier le HUD.

    Crédits

    Rédaction :

    • AymericRed

    Correction :

    • non effectuée

    Creative Commons
    Ce tutoriel de Minecraft Forge France est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International

    retourRetour vers le sommaire des tutoriels

    Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

    AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

    Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
    Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

    1 réponse Dernière réponse Répondre Citer 1
    • Ama
      Ama dernière édition par 23 juin 2017, 19:50

      GG, bon tuto, très intéressant !

      Plus d’exemples seraient les bienvenues par ailleurs

      Si je t'ai filé un coup de main n'oublie pas le + / -
      Par contre évite les demandes d'aides en MP, tu sera sympa'

      La JavaDoc c'est comme le PQ, ça sert à ce démerder tous seul. -Victor Hugo- 2017

      Une superbe API pour animer vos super modèles CraftStudio dans Minecraft !

      1 réponse Dernière réponse Répondre Citer 1
      • LeBossMax2
        LeBossMax2 dernière édition par 23 juin 2017, 21:35

        Salut !
        Sympa comme tuto, mais j’ai un petit truc à dire, dans la classe du HUD, quand tu explique les events, tu as mis deux fois l’event Pre.
        Ps, c’est méchant de mettre ce tuto quand je viens de finir mon HUD 😞

        1 réponse Dernière réponse Répondre Citer 1
        • AymericRed
          AymericRed dernière édition par 23 juin 2017, 23:20

          Ama > Merci et donnes-moi des exemples d’exemples car j’ai pas vraiment d’idée là comme ça ^^

          LeBossMax2 > Ah oui u_u j’ai changé, merci.
          Ah bah ça je savais pas hein.

          Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

          AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

          Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
          Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

          1 réponse Dernière réponse Répondre Citer 0
          • BrokenSwing
            BrokenSwing Moddeurs confirmés Rédacteurs dernière édition par 24 juin 2017, 06:50

            Pré-requis : https://www.minecraftforgefrance.fr/showthread.php?tid=4207
            Merci 😉

            1 réponse Dernière réponse Répondre Citer 0
            • AymericRed
              AymericRed dernière édition par 24 juin 2017, 10:08

              Ah oui c’est mieux :d
              En tous cas ça illustre ce que j’ai dit dans la shoutbox, donc je verrais pour faire valider quelques tutos ^^

              Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

              AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

              Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
              Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

              1 réponse Dernière réponse Répondre Citer 0
              • Ama
                Ama dernière édition par 24 juin 2017, 14:45

                Exemple sympa pour des mods rp

                Quand tu rentre dans une zone, une ville, etc, un texte s’affiche à l’écran puis disparaît en fondu. Tu le positionnes au milieu de l’écran toussa’ toussa’.

                Si je t'ai filé un coup de main n'oublie pas le + / -
                Par contre évite les demandes d'aides en MP, tu sera sympa'

                La JavaDoc c'est comme le PQ, ça sert à ce démerder tous seul. -Victor Hugo- 2017

                Une superbe API pour animer vos super modèles CraftStudio dans Minecraft !

                1 réponse Dernière réponse Répondre Citer 0
                • Deleted
                  Deleted dernière édition par 24 juin 2017, 14:49

                  Très bonne idée ! Y’aurait plusieurs moyens de procéder, j’ai hâte de voir comment Aymeric va s’y prendre, si il accepte la demande bien sûr 😃

                  1 réponse Dernière réponse Répondre Citer 0
                  • AymericRed
                    AymericRed dernière édition par 24 juin 2017, 15:37

                    Oh oui sympa comme idée, ça me permettra de voir comment faire un fondu j’ai jamais fait ça ^^

                    EDIT : La question étant que je fais juste le rendu (ce qui touche au tuto) en expliquant le reste ou je mets aussi le reste avec tout le code, hum…

                    Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

                    AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

                    Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
                    Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

                    1 réponse Dernière réponse Répondre Citer 0
                    • AymericRed
                      AymericRed dernière édition par 3 juil. 2017, 10:27

                      Ajout d’une explication pour dessiner du texte.

                      PS : J’ai pas oublié le bonus mais il faut que je trouve le temps de le faire.

                      Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

                      AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

                      Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
                      Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

                      1 réponse Dernière réponse Répondre Citer 1
                      • AymericRed
                        AymericRed dernière édition par 17 juil. 2017, 20:12

                        Petite correction dans l’explication pour dessiner du texte.
                        Le bonus arrivera normalement début Août.

                        Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

                        AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

                        Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
                        Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

                        1 réponse Dernière réponse Répondre Citer 0
                        • Ciolgaming
                          Ciolgaming dernière édition par robin4002 22 juin 2018, 21:39 31 déc. 2017, 19:35

                          Comment afficher une image en 1.7.10 svp ??

                          1 réponse Dernière réponse Répondre Citer 0
                          • Deleted
                            Deleted dernière édition par 31 déc. 2017, 20:08

                            Gui#drawTexturedModalRect

                            1 réponse Dernière réponse Répondre Citer 0
                            • ph1823
                              ph1823 dernière édition par 11 janv. 2018, 17:01

                              Plop, je sais pas si la qestion a était posé, en tout cas je ne l’ai pas vue, mais c’est aussi possible de faire l’HUD dans une classe à part et de faire new NomeLaClasse lors de l’event RenderGameOverlayEvent ? (d’ailleur c’est oblig’ d’avoir leRenderGameOverlayEvent.Post ou ca marche juste avec RenderGameOverlayEvent??)

                              Cordialement, le membre ayant le pseudo "ph1823"

                              Ma chaîne YouTube: https://www.youtube.com/c/ph1823
                              Mon Twitter : https://twitter.com/ph1823
                              Des jeux vidéo moin chers? Alors check ici : http://bit.ly/instaceph ou ici : http://bit.ly/g2aph

                              1 réponse Dernière réponse Répondre Citer 0
                              • Deleted
                                Deleted dernière édition par 11 janv. 2018, 17:30

                                Tout est possible en programmation. Mais après il faut éviter de réaliser l’inutile quand on en a l’idée, telle qu’instancier une classe à chaque tick…
                                L’idée serait de créer une instance dans ta classe d’event, et que si cette instance n’est pas null dans l’event, alors tu appelles TaClasse#draw, afin que quelque chose soit rendu à l’écran.

                                1 réponse Dernière réponse Répondre Citer 1
                                • AymericRed
                                  AymericRed dernière édition par 11 janv. 2018, 18:19

                                  Plaigon, l’homme plus rapide que son ombre ^^
                                  Sinon oui c’est possible mais comme l’a dit Plaigon, c’est pas propre du tout donc suis ses conseils.
                                  Et pour ton autre question, si tu utilises RenderGameOverlay au lieu de RenderGameOverlay.Post, ta fonction sera de mémoire appelée deux fois à chaque rendu ce qui est totalement inutile (ou sinon pas appellé du tout je suis plus sur).

                                  Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

                                  AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

                                  Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
                                  Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

                                  1 réponse Dernière réponse Répondre Citer 2
                                  • Ciolgaming
                                    Ciolgaming dernière édition par 2 mars 2018, 22:30

                                    Y aurait-il moyen de charger une image du web comme par exemple cette image qui montre la tete de son skin https://minotar.net/avatar/Ciolgaming

                                    Merci de votre réponse

                                    Bonne journée/soirée  🙂

                                    1 réponse Dernière réponse Répondre Citer 0
                                    • Deleted
                                      Deleted dernière édition par 2 mars 2018, 22:35

                                      Bonsoir,
                                      pour cela il te faudra déployer un objet URLConnection pour open ton url, puis download l’image et la stocker dans un objet BufferedImage, à l’aide de la fonction ImageIO.read, si je me souviens bien.
                                      A partir de là, le reste est enfantin, tu instancies une DynamicTexture, pour instancier enfin le ResourceLocation associé, puis le bind comme une image locale, bref, le reste pour draw est mentionné dans des dizaines de topics sur le fofo 😉

                                      1 réponse Dernière réponse Répondre Citer 1
                                      • L
                                        Le_Vrai_GG dernière édition par Le_Vrai_GG 21 mars 2019, 16:03 21 mars 2019, 15:56

                                        comment faire pour créer une classe seulement coté client?
                                        parce que @EventBusSubscriber(modid=TutorielMod.MODID, value={Side.CLIENT}) n’est pas reconnu comme annotation

                                        1 réponse Dernière réponse Répondre Citer 0
                                        • Superloup10
                                          Superloup10 Modérateurs dernière édition par 21 mars 2019, 16:59

                                          Sans doute car tu es dans une version antérieure au tutoriel.

                                          Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

                                          Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

                                          L 1 réponse Dernière réponse 21 mars 2019, 20:32 Répondre Citer 0
                                          • 1
                                          • 2
                                          • 3
                                          • 4
                                          • 1 / 4
                                          6 sur 64
                                          • Premier message
                                            6/64
                                            Dernier message
                                          Design by Woryk
                                          Contact / Mentions Légales

                                          MINECRAFT FORGE FRANCE © 2018

                                          Powered by NodeBB