Afficher du texte ou image sur le HUD d'un joueur



  • Bonjour a vous tous, je suis nouveau sur ce forum et je tiens avant tous a féliciter tous le travail fournit par la communauté.

    Grâce a vous tous, j'ai pu installer tous l'espace de travail nécessaire a la création de mod minecraft, j'ai fait le tour de tous le forum, mais je n'est trouver aucun information concernant mon problème, d'où le fait que je vienne demander de l'aide 🙂

    Alors mon problème est que je souhaite rajout du texte ou des images sur l'interface HUD des joueurs, j'ai fait plusieurs cherche sur internet et j'ai trouver ceci :

    FMLClientHandler.instance().getClient().fontRenderer.drawStringWithShadow(displayText(String), x(int), y(int), color(int));
    

    Qui visiblement fonctionnerai grâce à la méthode onRenderTick().

    C'est là que je bloque car je ne sais pas du tous ou insérer cette instance, d'après ce que j'ai compris il faudrait le mettre dans la méthode onRenderTick(), pour qu'il s'actualise a chaque TICK du jeu.

    Je ne cache pas j'ai jamais programmer en JAVA, je fait du C, C++, C#, PHP en tant qu’intermédiaire et la je me lance dans le JAVA, pour crée mon mod Minecraft.

    Je vous remercie par avance de toutes l'aides que vous pourriez m'apporter !


  • Moddeurs confirmés Rédacteurs Administrateurs

    Salut,
    Il y a deux événements qui permettent de faire ça. cpw.mods.fml.common.gameevent.TickEvent.RenderTickEvent de fml et net.minecraftforge.client.event.RenderGameOverlayEvent.Pre de Forge
    Pour les utiliser : https://www.minecraftforgefrance.fr/topic/636/utiliser-les-événements



  • Merci je vais me renseigner et étudier ça je reviens dès que c'est fait



  • Me revoilà bon bah merci ta piste ma guider sur la bonne voie 😛 j'arrive a afficher un texte (c'est un début :P), maintenant je cherche a affiche le biome actuel en fonction d’où se trouve le joueur, mais je rencontre une erreur, je place mes codes :

    MAIN :

    @EventHandler
    public void postInit(FMLPostInitializationEvent event)
    {
    MinecraftForge.EVENT_BUS.register(new InfoOverlay());
    }
    

    InfoOverlay() :

    import cpw.mods.fml.client.FMLClientHandler;
    import cpw.mods.fml.common.eventhandler.SubscribeEvent;
    import net.minecraft.client.Minecraft;
    import net.minecraft.client.gui.FontRenderer;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.MathHelper;
    import net.minecraft.util.MovingObjectPosition;
    import net.minecraft.world.World;
    import net.minecraftforge.client.event.RenderGameOverlayEvent;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    //–----------------------------------------------------------------------------------------
    
    public class InfoOverlay
    {
    private Minecraft mc;
    private String biomeString, fpsString;
    
    @SubscribeEvent
    public void renderGameOverlay(RenderGameOverlayEvent.Post event)
    {
    int x = MathHelper.floor_double(mc.thePlayer.posX);
    int z = MathHelper.floor_double(mc.thePlayer.posZ);
    fpsString = mc.debug.split(",", 2)[0];
    biomeString = mc.theWorld.getBiomeGenForCoords(x, z).biomeName;
    
    FMLClientHandler.instance().getClient().fontRenderer.drawStringWithShadow("Fps : "+fpsString, 5, 15, 0xffffff);
    FMLClientHandler.instance().getClient().fontRenderer.drawStringWithShadow("Biome : "+biomeString, 5, 25, 0xffffff);
    }
    }
    

    Erreur lors de la tentive de joindre le monde :

    java.lang.NullPointerException: Unexpected error
    at fr.paramystick.testmod.client.InfoOverlay.renderGameOverlay(InfoOverlay.java:27)
    at cpw.mods.fml.common.eventhandler.ASMEventHandler_4_InfoOverlay_renderGameOverlay_Post.invoke(.dynamic)
    at cpw.mods.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:51)
    at cpw.mods.fml.common.eventhandler.EventBus.post(EventBus.java:122)
    at net.minecraftforge.client.GuiIngameForge.post(GuiIngameForge.java:900)
    at net.minecraftforge.client.GuiIngameForge.renderHelmet(GuiIngameForge.java:263)
    at net.minecraftforge.client.GuiIngameForge.renderGameOverlay(GuiIngameForge.java:120)
    at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1121)
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1023)
    at net.minecraft.client.Minecraft.run(Minecraft.java:910)
    at net.minecraft.client.main.Main.main(Main.java:112)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:134)
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
    

    Visiblement d'après mes premiers recherche et test les erreurs serait au niveau de ces 4 lignes :

    int x = MathHelper.floor_double(mc.thePlayer.posX);
    int z = MathHelper.floor_double(mc.thePlayer.posZ);
    fpsString = mc.debug.split(",", 2)[0];
    biomeString = mc.theWorld.getBiomeGenForCoords(x, z).biomeName;
    

    Pourtant autocompletion fonctionne correctement donc il trouve bien ce que je cherche, et me déclare aucune erreur avant compilation.


  • Moddeurs confirmés Rédacteurs Administrateurs

    java.lang.NullPointerException veut dire que un de tes objets est null.
    Et dans ton cas, c'est l'objet mc qui est null.
    private Minecraft mc;
    Remplace par :
    private Minecraft mc = FMLClientHandler.instance().getClient();



  • Merci sa fonctionne mais j'aimerais comprendre pour l'auto-completion me dit que sa fonctionne alors qu'il manquait " = FMLClientHandler.instance().getClient(); " ???

    Et sinon l'affichage du FPS et Biome fonctionne mais sa ma déclencher un problème au niveau des barre de faim et au dessus de la barre de vie:

    Une idée ?


  • Moddeurs confirmés Rédacteurs Administrateurs

    Car l'objet mc aurait pu être initialisé ailleurs (dans le constructeur par exemple). Eclipse ne peut pas deviner toutes les erreurs.

    Pour le bug d'affichage, essaye comme ça :

    @SubscribeEvent
    public void renderGameOverlay(RenderGameOverlayEvent.Post event)
    {
    if(event.type != ElementType.EXPERIENCE)
    {
    return;
    }
    int x = MathHelper.floor_double(mc.thePlayer.posX);
    int z = MathHelper.floor_double(mc.thePlayer.posZ);
    fpsString = mc.debug.split(",", 2)[0];
    biomeString = mc.theWorld.getBiomeGenForCoords(x, z).biomeName;
    
    FMLClientHandler.instance().getClient().fontRenderer.drawStringWithShadow("Fps : "+fpsString, 5, 15, 0xffffff);
    FMLClientHandler.instance().getClient().fontRenderer.drawStringWithShadow("Biome : "+biomeString, 5, 25, 0xffffff);
    }
    }
    


  • D'accord je comprend pour le Minecraft mc = ….

    Et comment se fait-il que cette commande à régler le bug d'affichage ?

    if(event.type != ElementType.EXPERIENCE)
    {
    return;
    }
    

    désoler de tant vous sollicitez, mais j'aime bien comprendre comment sa fonctionne et pourquoi sa fonctionne 😉


  • Moddeurs confirmés Rédacteurs Administrateurs

    Normal que tu pose des questions ^^
    En fait l'event RenderGameOverlayEvent est appelé plusieurs fois avec un type différent à chaque fois, et il se trouve que faire apparaître quelque chose avec un autre type que EXPERIENCE fait completement planter l'affichage, donc avec ce code, si le type n'est pas EXPERIENCE, il ne fait plus rien (return; dans un void stop le void).



  • D'accord je comprend mieux si l'affichage et EXPERIENCE, il affiche, sinon non.

    OK merci pour toutes ces informations je clôture mon sujet !


Log in to reply