MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    DrawString et Overlay

    Planifier Épinglé Verrouillé Déplacé Résolu 1.7.x
    1.7.10
    33 Messages 5 Publieurs 4.2k Vues 1 Watching
    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.
    • robin4002R Hors-ligne
      robin4002 Moddeurs confirmés Rédacteurs Administrateurs
      dernière édition par

      @SubscribeEvent
      public void renderGameOverlayEvent(RenderGameOverlayEvent event)
      {
      String str;
      int i = event.resolution.getScaledWidth() - 10;
      int j = event.resolution.getScaledHeight() - 10;
      […]
      if (event.type == RenderGameOverlayEvent.ElementType.TEXT && itemstack != null && itemstack.getItem() == ModPg2.itemPlasmaGun && Minecraft.getMinecraft().gameSettings.thirdPersonView == 0 && Minecraft.getMinecraft().currentScreen == null)
      {
      if(itemstack.getTagCompound().getInteger("timerTir") >= 0 && itemstack.getTagCompound().getInteger("timerTir") <= 150)
      {
      str = EnumChatFormatting.DARK_GREEN + String.valueOf(itemstack.getTagCompound().getInteger("timerTir") + "/150");
      Minecraft.getMinecraft().fontRenderer.drawString(str, i - Minecraft.getMinecraft().fontRenderer.getStringWidth(str), j, 0);
      }
      […]
      
      

      Si getStringWidth ne fonctionne pas c’est getStringLenth.

      1 réponse Dernière réponse Répondre Citer 0
      • FolganskyF Hors-ligne
        Folgansky Correcteurs
        dernière édition par

        Oui je vois, ça met bien le texte dans le coin même si sa taille pourrait le faire dépasser de l’écran.

        Sauf que j’aimerais centrer le texte sous la barre de chargement de l’arme (entre les deux traits vert, différents overlays se succèdent pour indiquer l’état de charge.)

        Bref, laisser le string dans un coin n’est pas pratique pour la fonction qu’il doit remplir.
        Même si cette fonction qui récupère la taille du texte est pratique et que toute personne intéressée par le sujet devrait la retenir

        Edit: Ce que je ne comprend pas, c’est pourquoi il n’y a pas de fonction qui récupère la taille réelle de la fenêtre de jeu.

        1 réponse Dernière réponse Répondre Citer 0
        • DeletedD Hors-ligne
          Deleted
          dernière édition par

          Minecraft.getMinecraft().displayWidth ?

          1 réponse Dernière réponse Répondre Citer 0
          • robin4002R Hors-ligne
            robin4002 Moddeurs confirmés Rédacteurs Administrateurs
            dernière édition par

            Le plus simple serait de rendre la barre en fonction du texte.

            1 réponse Dernière réponse Répondre Citer 0
            • FolganskyF Hors-ligne
              Folgansky Correcteurs
              dernière édition par

              J’ai mal exprimé le problème, mais je l’avais déjà fais plus en amont.
              Même si je récupère bien la taille de la fenêtre, si à pleine écran je décale mon texte de 90, en passant en fenêtre réduite, ce -90 ne sera pas propotionnel et j’aurai le même problème qu’actuellement visible sur les screens.

              Sauf que je n’ai pas trovué comment avoir un affichage correct avec des paramètres proportionnels.

              Quand je tente de faire “marésolution” * (9/10) pour que peu importe la résolution, le texte soit affiché toujours au même endroit, ça ne fonctionne pas (ou en tout cas je m’y prend mal)

              edit: Justement non robin car ma barre elle est affichée de façon proportionnelle (je ne sais juste pas comment ça fonctionne, histoire d’avoir l’air con)

              En gros j’ai ça

              public static void renderTextureOverlay(ResourceLocation s, float f)
                     {
                         Minecraft minecraft = FMLClientHandler.instance().getClient();
                         ScaledResolution scaledresolution = new ScaledResolution(minecraft, minecraft.displayWidth, minecraft.displayHeight);
                         int i = scaledresolution.getScaledWidth();
                         int j = scaledresolution.getScaledHeight();
                         GL11.glEnable(GL11.GL_BLEND);
                         GL11.glDisable(GL11.GL_DEPTH_TEST);
                         GL11.glDepthMask(false);
                         GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
                         GL11.glColor4f(1.0F, 1.0F, 1.0F, f);
                         GL11.glDisable(GL11.GL_ALPHA_TEST);
                         minecraft.getTextureManager().bindTexture(s);
                         Tessellator tessellator = Tessellator.instance;
                         tessellator.startDrawingQuads();
                         tessellator.addVertexWithUV(0.0D, j, -90D, 0.0D, 1.0D);
                         tessellator.addVertexWithUV(i, j, -90D, 1.0D, 1.0D);
                         tessellator.addVertexWithUV(i, 0.0D, -90D, 1.0D, 0.0D);
                         tessellator.addVertexWithUV(0.0D, 0.0D, -90D, 0.0D, 0.0D);
                         tessellator.draw();
                         GL11.glDepthMask(true);
                         GL11.glEnable(GL11.GL_DEPTH_TEST);
                         GL11.glEnable(GL11.GL_ALPHA_TEST);
                         GL11.glColor4f(1.0F, 1.0F, 1.0F, f);
                     }
              

              Et dans ma fonction renderGameOverlayEvent je n’ai plus qu’à mettre

              renderTextureOverlay(zoomOverlay, 1.0F);
              

              Sauf que pour afficher mon string je ne peux pas passer par un overlay, d’où le sujet
              Ou alors il y a moyen de copier du bout de code pour que l’affichage de mon string se passe de la même façon que les images.
              Elles sont en base 256, pour ça que j’avais un problème de transparence, résolu par ta condition sur l’ElementType Robin.

              1 réponse Dernière réponse Répondre Citer 0
              • robin4002R Hors-ligne
                robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                dernière édition par

                Pour ça que j’ai dis de draw en fonction du str.
                La taille de ton str sera toujours fixe. Avec fond renderer tu peux avoir cette taille. Tu la divise pas 2 pour avoir le centre. Le centre de ton texte doit aussi être le centre de ton image. Donc tu draw l’image en fonction de ce centre.

                1 réponse Dernière réponse Répondre Citer 0
                • FolganskyF Hors-ligne
                  Folgansky Correcteurs
                  dernière édition par

                  Robin, je crois que tu ne comprends pas que c’est la position du texte qui me dérange Xd

                  J’ai edit mon précédent message où y’a du GL11 que je comprends pas mais qui me semble être la piste à suivre pour que l’emplacement du texte reste le même en fonction de la taille de la fenêtre de jeu.

                  Depuis qqs messages tu restes sur la taille du texte mais elle me sert pas à grand chose dans ma problématique principale =/

                  1 réponse Dernière réponse Répondre Citer 0
                  • robin4002R Hors-ligne
                    robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                    dernière édition par

                    Fais moi un screenshot du problème x)

                    1 réponse Dernière réponse Répondre Citer 0
                    • FolganskyF Hors-ligne
                      Folgansky Correcteurs
                      dernière édition par

                      Bah c’est déjà fait plus tôt dans le sujet Robin ^^’

                      Il est page deux, description:

                      Screen du haut c’est en écran réduit (petite fenêtre), j’ai centré le texte sur la barre de chargement en fonction de cette tailler d’écran.
                      Screen en dessous c’est en “plein écran”, le texte n’est plus centré car ce qui est bon en petite résolution ne l’est plus en grand car l’affichage n’est pas proportionnel.

                      (Si je centre le texte sous la barre en mode grand écran, une fois en petit affichage, le texte se mêle à la barre d’inventaire)

                      En l’état je pourrais laisser ça tel quell, mais ça serait bâcler et ne pas chercher à mieux comprendre.

                      Edit:
                      Celui là

                      1 réponse Dernière réponse Répondre Citer 0
                      • robin4002R Hors-ligne
                        robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                        dernière édition par

                        En quoi ma solution ne fonctionnerai pas ?
                        Moi ce que je te propose c’est de rendre les deux barres en fonction de l’emplacement du texte, le résultat final sera presque le même.

                        Après tu peux aussi décaler le texte en fonction de la taille de l’écran mais ça sera plus compliqué à ajuster.

                        1 réponse Dernière réponse Répondre Citer 0
                        • FolganskyF Hors-ligne
                          Folgansky Correcteurs
                          dernière édition par

                          D’acc, je voulais éviter cette solution car je ne sais pas rendre autrement mon overlay qu’en 256x256, faute de compréhension du code.
                          Quelqu’un m’a parlé de la fonction DrawRect ou qqch du genre en parlant du render du GUI mais je ne sais pas faire.

                          Le tuto du GUI et container m’a semblé trop spécifique, en tout cas si ce sont les bonnes fonctions je vais y jeter de nouveau toute mon attention mais ça ne m’avait pas l’air aussi simple que le drawString où les conditions sont juste un string et 3 int (coordonnées et couleur).

                          Est ce que ce serait aussi simple?

                          J’ai ma déclaration de ressource:

                          public static final ResourceLocation trucBidule= new ResourceLocation(TrucBidule.MODID, "textures/overlay/TrucBidule.png");
                          

                          **[un peu plus tard]
                          **
                          J’viens de retrouver la fonction dans ce sujet (Petit probleme GUI)

                          Minecraft.getMinecraft().getTextureManager().bindTexture(trucBidule);
                          drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize);
                          

                          Par contre est-ce qu’il faut du GL11.JeNeSaisQuoi avant et après?
                          Notamment que le draw sache de quelle texture on parle, sauf si le bindTexture remplit déjà ce rôle

                          Bref, je ne sais pas faire.

                          1 réponse Dernière réponse Répondre Citer 0
                          • robin4002R Hors-ligne
                            robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                            dernière édition par

                            Donc en fait ta texture actuelle c’est une 256x256 entièrement transparente avec juste ta barre en bas à gauche ?

                            La partie qui draw ta texture dans ton code actuelle c’est ça :

                                      minecraft.getTextureManager().bindTexture(s); // bind la texture
                                      Tessellator tessellator = Tessellator.instance;
                                      tessellator.startDrawingQuads(); // débute le dessin d'un quadrilatère
                                      tessellator.addVertexWithUV(0.0D, j, -90D, 0.0D, 1.0D);
                                      tessellator.addVertexWithUV(i, j, -90D, 1.0D, 1.0D);
                                      tessellator.addVertexWithUV(i, 0.0D, -90D, 1.0D, 0.0D);
                                      tessellator.addVertexWithUV(0.0D, 0.0D, -90D, 0.0D, 0.0D);
                                      tessellator.draw();// termine le dessin
                            

                            Entre tu as : addVertexWithUV
                            Cela dessine un vecteur. Avec 4 vecteur tu obtiens donc un quadrilatère.
                            Les arguments sont les suivants :
                            addVertexWithUV(début, fin, zlevel, ratio début texture, ratio fin texture);
                            le début et la fin sont les coordonnées à l’écran. Le zlevel c’est une sorte de couche, si un rendu a un zlevel plus faible il sera derrière un rendu avec un zlevel plus élevé même s’il est rendu après (ou l’inverse, je en sais plus exactement).
                            Le deux dernier argument sont le ratio dans le fichier de l’image. Si ton image fait 32x32 et que dans le code tu mets des 0.5D à la place des 1.0D tu vas avoir seulement le quart du haut gauche rendu (donc une texture de 16x16).

                            Si on veut passer ça en x, y ça donne :

                                      Tessellator tessellator = Tessellator.instance;
                                      tessellator.startDrawingQuads();
                                      tessellator.addVertexWithUV(x0, y1, -90D, 0.0D, 1.0D);
                                      tessellator.addVertexWithUV(x1, y1, -90D, 1.0D, 1.0D);
                                      tessellator.addVertexWithUV(x1, y0, -90D, 1.0D, 0.0D);
                                      tessellator.addVertexWithUV(x0, y0, -90D, 0.0D, 0.0D);
                                      tessellator.draw();
                            

                            où x0 est la coordonné x de début, x1 la coordonné x de fin, y0 est la coordonné y de début, y1 la coordonné y de fin

                            1 réponse Dernière réponse Répondre Citer 0
                            • FolganskyF Hors-ligne
                              Folgansky Correcteurs
                              dernière édition par

                              J’y suis allé un peu comme un bourrin je crois xD

                              [19:01:42] [Client thread/ERROR]: ########## GL ERROR ##########
                              [19:01:42] [Client thread/ERROR]: @ Post render
                              [19:01:42] [Client thread/ERROR]: 1286: Invalid framebuffer operation
                              

                              Voici mon code, je n’ai pas changé la taille de l’image (qui est bien** 256x256)**
                              :::

                              public static void renderTextureOverlay1(ResourceLocation s, float f)
                                  {
                                      Minecraft minecraft = FMLClientHandler.instance().getClient();
                                      ScaledResolution scaledresolution = new ScaledResolution(minecraft, minecraft.displayWidth, minecraft.displayHeight);
                                      int i = scaledresolution.getScaledWidth();
                                      int j = scaledresolution.getScaledHeight();
                                      Tessellator tessellator = Tessellator.instance;
                                      tessellator.startDrawingQuads();
                                      tessellator.addVertexWithUV(0.0D, j + 10, -90D, 0.0D, 1.0D);
                                      tessellator.addVertexWithUV(i + 90, j + 10, -90D, 1.0D, 1.0D);
                                      tessellator.addVertexWithUV(i + 90, 0.0D, -90D, 1.0D, 0.0D);
                                      tessellator.addVertexWithUV(0.0D, 0.0D, -90D, 0.0D, 0.0D);
                                      tessellator.draw();
                                  }
                              

                              :::

                              Je me suis dis que je pouvais me contenter de la décaler même si elle “déborde”
                              Je vais recouper mon image pour faire d’autres tests.

                              Merci pour ces explications en tout cas Robin

                              1 réponse Dernière réponse Répondre Citer 0
                              • 1
                              • 2
                              • 2 / 2
                              • Premier message
                                Dernier message
                              Design by Woryk
                              ContactMentions Légales

                              MINECRAFT FORGE FRANCE © 2024

                              Powered by NodeBB