Code pour bouton possédant une texture



  • Salut tout le monde
    J'ai un problème depuis maintenant un bon moment. J'aimerai mettre une texture custom à un bouton, j'ai pris exemple sur le bouton de langue mais en jeux mon bouton n'est rendu qu'a moitié, j'ai pourtant bien mis les mêmes dimensions dans eclipse que sur mon image !
    Voici mon code :

    
    package mrplaigon.zombarcraft.customgui.client;
    
    import mrplaigon.zombarcraft.customgui.common.CustomGuiMod;
    import net.minecraft.client.Minecraft;
    import net.minecraft.client.gui.GuiButton;
    import net.minecraft.util.ResourceLocation;
    
    import org.lwjgl.opengl.GL11;
    
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    
    @SideOnly(Side.CLIENT)
    public class CustomButton extends GuiButton
    {
    
        public CustomButton(int p_i1041_1_, int p_i1041_2_, int p_i1041_3_)
        {
            super(p_i1041_1_, p_i1041_2_, p_i1041_3_, 20, 20, "");
        }
    
        /**
         * Draws this button to the screen.
         */
        public void drawButton(Minecraft p_146112_1_, int p_146112_2_, int p_146112_3_)
        {
            if (this.visible)
            {
                p_146112_1_.getTextureManager().bindTexture(new ResourceLocation(CustomGuiMod.MODID, "textures/gui/playButton.png"));
                boolean flag = p_146112_2_ >= this.xPosition && p_146112_3_ >= this.yPosition && p_146112_2_ < this.xPosition + this.width && p_146112_3_ < this.yPosition + this.height;
                int k = 200;
    
                this.drawTexturedModalRect(this.xPosition, this.yPosition, 0, 0, this.width, this.height);
            }
        }
    }
    

    Merci d'avance 😃


  • Moddeurs confirmés Modérateurs

    quelle sont les dimensions de ton image?



  • @'isador34':

    quelle sont les dimensions de ton image?

    20 x 20


  • Moddeurs confirmés Modérateurs

    Il faut des dimensions en puissance de deux: 1 2 4 8 16 32 64 etc….



  • @'isador34':

    Il faut des dimensions en puissance de deux: 1 2 4 8 16 32 64 etc….

    Nan pas pour les boutons, et je suis sûr de ce que je dit car je me suis basé sur le bouton de language qui lui aussi a des dimensions de 20 x 20.


  • Moddeurs confirmés Rédacteurs Administrateurs

    Le fichier doit faire la taille d'un multiple de deux. Après dans ton fichier tu aura que 20x20 en couleur, le reste doit être en transparence.



  • Sa ne marche toujours pas j'ai crée un .png de 32x32 et j'ai mis mon image de 20x20 en haut à gauche dans l'angle. De plus j'ai bien mis 20x20 et j'ai bien refresh le projet mais rien à faire c'est toujours buggé. Si vous souhaitez les classes ou le fichier.png dites le moi


  • Moddeurs confirmés Rédacteurs Administrateurs

    Envoie directement ton dossier src en mp, je fais regarde ça. Mais à mon avis faudrait plutôt une texture 256x256, c'est ce que Minecraft utilise il me semble.


    Du-coup j'ai reprit le code de base mc :

    ​package mrplaigon.zombarcraft.customgui.client;
    
    import mrplaigon.zombarcraft.customgui.common.CustomGuiMod;
    import net.minecraft.client.Minecraft;
    import net.minecraft.client.gui.FontRenderer;
    import net.minecraft.client.gui.GuiButton;
    import net.minecraft.client.renderer.OpenGlHelper;
    import net.minecraft.util.ResourceLocation;
    
    import org.lwjgl.opengl.GL11;
    
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    
    @SideOnly(Side.CLIENT)
    public class CustomButton extends GuiButton
    {
    
        public CustomButton(int id, int x, int y)
        {
            super(id, x, y, 20, 20, "");
        }
    
        public void drawButton(Minecraft mc, int x, int y)
        {
            if (this.visible)
            {
                FontRenderer fontrenderer = mc.fontRenderer;
                mc.getTextureManager().bindTexture(new ResourceLocation(CustomGuiMod.MODID, "textures/gui/test.png"));
                GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
                this.field_146123_n = x >= this.xPosition && y >= this.yPosition && x < this.xPosition + this.width && y < this.yPosition + this.height;
                int k = this.getHoverState(this.field_146123_n);
                System.out.println(k);
                GL11.glEnable(GL11.GL_BLEND);
                OpenGlHelper.glBlendFunc(770, 771, 1, 0);
                GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
                this.drawTexturedModalRect(this.xPosition, this.yPosition, 0, 46 + k * 20, this.width / 2, this.height);
                this.drawTexturedModalRect(this.xPosition + this.width / 2, this.yPosition, 200 - this.width / 2, 46 + k * 20, this.width / 2, this.height);
                this.mouseDragged(mc, x, y);
                int l = 14737632;
    
                if (packedFGColour != 0)
                {
                    l = packedFGColour;
                }
                else if (!this.enabled)
                {
                    l = 10526880;
                }
                else if (this.field_146123_n)
                {
                    l = 16777120;
                }
    
                this.drawCenteredString(fontrenderer, this.displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, l);
            }
        }
    }
    

    Et la texture de mc modifiée :
    http://i.imgur.com/QrJorgY.png

    Pour le fonctionnement :
    En fait le bouton est draw en deux morceaux :
                this.drawTexturedModalRect(this.xPosition, this.yPosition, 0, 46 + k * 20, this.width / 2, this.height);
                this.drawTexturedModalRect(this.xPosition + this.width / 2, this.yPosition, 200 - this.width / 2, 46 + k * 20, this.width / 2, this.height);
    La première ligne fait la première moitié du bouton, celle de gauche. On commence donc au coordonné du bouton (this.xPosition, this.yPosition) le premier 0 c'est la coordonné x dans le fichier de texture, 46 + k * 20 c'est la coordonné y (k vaut 0 si le bouton est off, 1 si il est activé mais que la souris n'est pas dessus et 2 si il est activé et que la souris est dessus). Si tu compares avec le fichier de texture le 46 correspond aux autres textures qui sont au dessus, donc si tu vire les cases d'inventaire et que tu mets les boutons tout en haut du fichier de texture il faudra enlever ce 46. Ensuite on précise sur combien de pixel on affiche (ici this.width / 2, this.height, donc sur toute la hauteur du bouton et sur la moitié de la largeur).
    La deuxième ligne c'est le même principe mais pour la moitié de droite, donc les coordonnés changent.



  • Merci beaucoup Robin mais y'a pas moyen que je fasse ça dans une texture individuelle car j'ai masse boutons à rajouter et y'en a seront bien + gros que 20x20 et ça ne tiendra jamais là dedans. Je peux pas faire ça autre part ? Le mod thirst mod il rajoute une barre de soif, c'est le même principe ?


  • Moddeurs confirmés Rédacteurs Administrateurs

    ça fonctionne avec des fichiers de 256x256, je ne sais pas pour le reste. Après tu peux très bien faire un fichier par bouton, mais regrouper éviterai de charger 50 fichier.



  • @'robin4002':

    ça fonctionne avec des fichiers de 256x256, je ne sais pas pour le reste. Après tu peux très bien faire un fichier par bouton, mais regrouper éviterai de charger 50 fichier.

    Ok je vais essayer de faire une texture de 256 x 256 et de placer un de mes boutons dedans. Ensuite je me servirai de tes explications sur la méthode pour draw, si j'ai des questions je n'hésiterai pas comme d'habitude xD


Log in to reply