Résolu Custom GUI

Discussion dans 'Support modding' créé par GreenTree0, 10 Février 2019.

  1. GreenTree0

    GreenTree0 Nouveau

    Inscrit:
    25 Janvier 2019
    Messages:
    9
    J'aime reçus:
    0
    Bonjour bonjour,
    j'étais déjà venu ici il y a environ 15 jours, j'ai pas mal avancer sur mon mod depuis sans problème (enfin presque), et je reviens ici encore une fois (et probablement pas la dernière ! ^^), cette fois-ci j'ai décider de m'atteler à une autre facette de mon mod, j'ai besoin de pouvoir faire une barre de vie modifiée dans le jeu,
    je n'ai pu trouver aucun tutoriel anglais/français sur ça donc j'ai regarder un tutoriel en allemand :(, j'ai suivi toutes les étapes dont je comprend sans problème les commandes, je n'ai pas d'erreur dans Eclipse mais la barre de vie n’apparaît pas en jeu.
    Sachant que pour le moment, ce code n'est même pas censé faire une barre de vie mais simplement dessiner une barre sans utilité au dessus de la barre de faim.

    Voila donc le code (très simple pourtant, je vois pas d'ou viens l'erreur !) :

    Code:
    package mod.test.util;
    
    import net.minecraft.client.Minecraft;
    import net.minecraft.util.ResourceLocation;
    import net.minecraftforge.client.event.RenderGameOverlayEvent;
    import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType;
    import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
    
    public class Events {
        @SubscribeEvent
        public void onRenderGameOverlay(RenderGameOverlayEvent event) {
            if(!event.isCancelable() && event.getType() == ElementType.EXPERIENCE) {
                Minecraft mc = Minecraft.getMinecraft();
              
                if (!mc.player.capabilities.isCreativeMode) {
                    int posX = event.getResolution().getScaledWidth() / 2 + 10;
                    int posY = event.getResolution().getScaledHeight() - 48;
          
                    mc.renderEngine.bindTexture(new ResourceLocation(Reference.MOD_ID + ":textures/gui/lifebar.png"));
          
                    mc.ingameGUI.drawTexturedModalRect(posX, posY, 0, 0, 860, 101);
                    mc.ingameGUI.drawTexturedModalRect(posX+1, posY+1, 0, 108, 631, 47);
                }
            }
        }
    }
    
    Et voici une image de la barre supposée apparaître :
    upload_2019-2-10_14-30-3.png

    J'en profite également pour poser plusieurs autres questions afin de ne pas avoir à vous embêter tout de suite encore x) :

    Comment, une fois que j'ai la barre, faire en sorte qu'elle s'adapte à la vie du joueur (qu'elle soit plus ou moins complétée) ?

    Comment faire en sorte de cacher la barre de vie originelle ?

    Comment rajouter un texte adaptatif sur la barre de vie en elle même (par exemple je voudrais que à gauche de la barre de vie il y ai le pseudo du joueur mais que la taille de la barre s'adapte à la taille du pseudo pour qu'il n’empiète pas dessus) ?

    P.S : Si vous répondez juste au problème de base sans répondre forcément aux questions c'est déjà génial, merci ! =D
     
  2. robin4002

    robin4002 Étudiant en informatique
    Staff Responsable technique Responsable forum

    Inscrit:
    12 Novembre 2012
    Messages:
    15 494
    J'aime reçus:
    2 522
    Salut,

    Je pense que tu as oublié d'enregistrer la classe comme étant une classe d'event.
    https://www.minecraftforgefrance.fr...nregistrer-la-classe-contenant-les-événements

    Pour adapter la barre à la vie du joueur il faut draw dans tous les cas la première partie de ton image (la partie grise) et draw seulement partiellement la deuxième partie (celle en vert), en mettant comme valeur x de la fonction de draw un fonction qui dépend de la vie du joueur / par le total de la vie.
    Tu peux aller voir dans la classe GuiIngameMenu pour avoir une idée de comment Minecraft gère ça à la base.

    Enfin pour cacher la barre de vie orignal il faut cancel l'event (event.setCancel(true)), il faudra par contre mettre RenderGameOverlayEvent.Pre au lieu de RenderGameOverlayEvent (car l'event est en deux parties, Pre et Post, respectivement déclenché avant le rendu de l'overlay original de Minecraft et après. Forcement seulement le Pre peut être annulé, puisque lors que le Post est déclenché le rendu a déjà été fait).
    Avant de cancel, il faudra juste vérifier avec une condition sur event.getType() que l'élément en cours et le rendu de la vie (sans vérification tu vas annuler le rendu de tout l'overlay).
     
  3. GreenTree0

    GreenTree0 Nouveau

    Inscrit:
    25 Janvier 2019
    Messages:
    9
    J'aime reçus:
    0
    Déjà, merci beaucoup pour ta réponse,
    Ça a bien marché, la barre s'affiche en jeu ! Mais maintenant, et après beaucoup de galère, j'ai encore quelques petit soucis, alors pour l'alignement entre les deux barres ça je m'en occuperai plus tard, mais déjà gros problème : à la place de ne m'afficher qu'une barre, j'en ai 2, une en haut à gauche et une en haut à droite et je sais pas pourquoi.
    Ensuite j'ai tenter un code pour que la vie s'adapte mais c'est devenu encore plus n'importe quoi et j'avoue comprendre de moins en moins, je croyais que dans la commande "drawTexturedModalRect(posX, posY, textureX, textureY, width, height);" width et height étaient en pixel ce qui je pense n'est en fait pas le cas, avec le code ci-dessous, quand je perd de la vie la barre en haut à droite est affectée puis après avoir perdu environ la moitié de ma vie c'est la barre en haut à gauche qui est affectée (sachant que la barre en haut à droite est vide), j'avoue ne rien comprendre, merci pour l'aide !

    Voila le code (les messages ne me servaient qu'a faire des tests) :

    Code:
    package mod.test.util;
    
    import net.minecraft.client.Minecraft;
    import net.minecraft.entity.player.EntityPlayerMP;
    import net.minecraft.util.ResourceLocation;
    import net.minecraftforge.client.event.RenderGameOverlayEvent;
    import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType;
    import net.minecraftforge.fml.common.ModClassLoader;
    import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
    
    public class Events {
        @SubscribeEvent
        public void onRenderGameOverlay(RenderGameOverlayEvent event) {
            if(!event.isCancelable() && event.getType() == ElementType.EXPERIENCE) {
                Minecraft mc = Minecraft.getMinecraft();
              
                if (!mc.player.capabilities.isCreativeMode) {
                    int posX = 1;
                    int posY = 1;
                    double health = (int) mc.player.getHealth();
                    double maxhealth = (int) mc.player.getMaxHealth();
                    double scale = health / maxhealth;
                    double toDraw = scale*795;
                    Minecraft.getMinecraft().player.sendChatMessage("Scale =" + health + "/" + maxhealth);
                    Minecraft.getMinecraft().player.sendChatMessage("Scale =" + scale);
                    Minecraft.getMinecraft().player.sendChatMessage("toDraw =" + toDraw);
                    Minecraft.getMinecraft().player.sendChatMessage("int toDraw = " + (int)toDraw);
                    mc.renderEngine.bindTexture(new ResourceLocation(Reference.MOD_ID + ":textures/gui/lifebar.png"));
          
                    mc.ingameGUI.drawTexturedModalRect(posX, posY, 0, 0, 988, 101);
                    
                    mc.renderEngine.bindTexture(new ResourceLocation(Reference.MOD_ID + ":textures/gui/lifebargreen.png"));
                    mc.ingameGUI.drawTexturedModalRect(posX, posY, 0, 0, (int) toDraw, 28);
                    
                }
            }
        }
    }
    Et voici un screenshot (le fait que la barre verte ne soit pas au bonne endroit est normal, mais normalement ya 1 barre verte et 1 barre grise)
    :
    upload_2019-2-10_23-17-30.png
     
  4. robin4002

    robin4002 Étudiant en informatique
    Staff Responsable technique Responsable forum

    Inscrit:
    12 Novembre 2012
    Messages:
    15 494
    J'aime reçus:
    2 522
  5. GreenTree0

    GreenTree0 Nouveau

    Inscrit:
    25 Janvier 2019
    Messages:
    9
    J'aime reçus:
    0
    Encore une fois merci, après plusieurs essais j'ai finalement réussis en mettant en 256 height et width, mais je comprends pas pourquoi et en plus ca crée d'autres petit bugs, à cause d'une chose : mon image dans mon dossier est en px, en 1024*1024, alors pourquoi ca marche ? Et comment je peux trouver la valeur exacte de la taille de mon image se situant probablement entre 220 et 256 px :/ ?
     
  6. robin4002

    robin4002 Étudiant en informatique
    Staff Responsable technique Responsable forum

    Inscrit:
    12 Novembre 2012
    Messages:
    15 494
    J'aime reçus:
    2 522
    La fonction drawTexturedModalRect est uniquement faite pour travailler avec des images de 256x256. Une image de 1024*1024 sera vu comme une image de 256x256 avec une meilleur résolution (en gros comme si c'est un pack de ressource de 64x64 au lieu de 16x16).

    Pour savoir quelle est la bonne valeur regarde le nombre de pixel en x sur ton image et divise cette valeur par 4.
     
  7. GreenTree0

    GreenTree0 Nouveau

    Inscrit:
    25 Janvier 2019
    Messages:
    9
    J'aime reçus:
    0
    Merci beaucoup ! Après pas mal d'essais j'ai finis par comprendre le fonctionnement et j'ai réussis à faire une barre de vie fonctionnelle, qui change de couleur selon le niveau de vie (vert, jaune, rouge) et qui à des animations fluides. J'ai également réussis à cacher la barre de vie sans soucis. Donc le problème est résolu ! Donc je le met tel quel, ceci dit, j'ai encore une question, mais je me suis pas encore énormément renseigné sur la chose. Je voudrais crée une barre de vie courbée pour toutes les entités, en clair une barre de vie qui ne serait pas au dessus du monstre (ce qui serait déjà un bon début ceci dit) mais sous la forme d'un demi arc de cercle qui entoure un côté du monstre, une idée de tutoriel ou quoique ce soit qui pourrait m'aider ?
    En tout cas merci beaucoup pour l'aide, la barre de vie c'est déjà génial !
     
  8. robin4002

    robin4002 Étudiant en informatique
    Staff Responsable technique Responsable forum

    Inscrit:
    12 Novembre 2012
    Messages:
    15 494
    J'aime reçus:
    2 522
    Alors pour faire ça il faudra utiliser des fonctionnalités d'OpenGL, ce qui n'est pas vraiment mon point fort.
     

Partager cette page