DrawString et Overlay
-
Parce que je n’ai pas vraiment idée de quoi tu me parles ^^’
J’ai des lacunes évidentes.M’enfin, si j’arrive à résoudre le problème de l’affichage de mon String, je pourrais me passer de l’affichage d’overlay (ce qui m’évitera de nombreuses heures à chercher comment afficher correctement les overlays)
-
Cherche une fonction appelée drawTextureModalRect dans la classe Gui de Minecraft ou copie cette fonction (c’est la même mais avec les paramètres renommées pour une meilleure compréhension) :
@SideOnly(Side.CLIENT) public static void drawTexturedModalRect(double x, double y, double textureX, double textureY, double width, double height) { Tessellator tessellator = Tessellator.instance; tessellator.startDrawingQuads(); tessellator.addVertexWithUV(x, y + height, 0F, textureX * 0.00390625F, (textureY + height) * 0.00390625F); tessellator.addVertexWithUV(x + width, y + height, 0.0F, (textureX + width) * 0.00390625F, (textureY + height) * 0.00390625F); tessellator.addVertexWithUV(x + width, y, 0F, (textureX + width) * 0.00390625F, textureY * 0.00390625F); tessellator.addVertexWithUV(x, y, 0F, textureX * 0.00390625F, textureY * 0.00390625F); tessellator.draw(); }Pour l’affichage de texte, je suppose que le problème c’est que le texte n’est pas affiché ?
-
Non le problème concernant le drawString c’est qu’il modifie la couleur d’affichage de la nourriture et de l’armure

-
Essaie de faire un GL11.glColor4f(0F, 0F, 0F, 1F) après le rendu, ça devrait enlever la couleur.
-
Ou alors :
@SubscribeEvent public void onRenderGameOverlay(RenderGameOverlayEvent.Post event) { if(event.type == RenderGameOverlayEvent.ElementType.TEXT) { // reste du code -
Scarex, ton conseil fait que tout devient noir ^^
J’ai pas cherché à savoir si c’était le troisième int du drawString qui fait ça ou la ligne que tu m’as conseillé d’ajouter, en tout cas c’est pas ça.Par contre ta condition marche robin.
Du coup au diable les overlays, je comprendrai un jour comment ça marche (oui comme ça en me réveillant un matin, la science infuse)
En tout cas merci à tous deux d’avoir passé un peu de votre temps sur ce post ^^
Edit:
Euh apparement mettre ta condition semble aussi résoudre mon problème d’overlay (et de transparence en fait), c’est parfait Oo -
J’aurais juste une dernière question du coup, concernant les paramètres.
Je fais comme ça actuellement:
Minecraft minecraft = FMLClientHandler.instance().getClient(); ScaledResolution scaledresolution = new ScaledResolution(minecraft, minecraft.displayWidth, minecraft.displayHeight); int i = scaledresolution.getScaledWidth() - 90; int j = scaledresolution.getScaledHeight() - 10;Le soucis c’est que la position du String n’est pas la même en réduisant la taille de la fenêtre de jeu.
Comment remplacer les “moins quelquechose” pour que ce soit toujours placé au même endroit sur l’écran, peu importe la taille de la fenêtre de jeu, svp?Edit:
Par exemple j’ai essayé comme ça:int i = scaledresolution.getScaledWidth() * (92/100); int j = scaledresolution.getScaledHeight() * (98/100);Visiblement cette triche sur le int ne plaît pas.
Au final le String se loge en PLS dans le coin en haut à gauche de l’écran au lieu d’aller tranquille dans le coin opposé en mode “no stress”. -
Déjà utilise event.resolution au lieu de faire une nouvelle instance de ScaledResolution.
Si tu veux mettre le string en haut à droite il faut prendre la largeur de l’écran moins le décalage (5 ou 10) moins la largeur du texte. Il y a une fonction dans FontRenderer pour avoir la largeur du texte.
-
Le soucis c’est justement le décalage.

Des deux affichages, la seule différence c’est la taille de la fenêtre de jeu.
Donc est-ce que c’est le paramètrage par défaut qui veut ça?
Donc on ne pourrait rien y faire et les joueurs, qui joueraient en écran réduit, pourraientt avoir des superpositions de rendusEdit: Et ouki pour le event.resolution
-
Suffit d’adapter le décalage en fonction de la largeur alors.
-
Eh bien je définis la largeur avec:
int i = event.resolution.getScaledWidth() - 90; int j = event.resolution.getScaledHeight() - 10;Sauf que justement si je suis en fenêtre réduite le -90 fera plus de décalage que si je me mets en plein écran.
Aucun moyen que le décalage soit proportionnel également? -
Envoies moi ton code complet. Car ton i et ton j je ne sais pas ce que tu en fais x)
-
La classe est longue et redondante mais voici un bout où on voit ce que tu me demandes:
@SubscribeEvent public void renderGameOverlayEvent(RenderGameOverlayEvent event) { String str; int i = event.resolution.getScaledWidth() - 90; 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, j, 0); } […] -
@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.
-
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 retenirEdit: 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.
-
Minecraft.getMinecraft().displayWidth ?
-
Le plus simple serait de rendre la barre en fonction du texte.
-
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. -
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. -
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 =/