Update d'une texture sur un GUI



  • Bonjour à tous, j'ai un problème avec les updates de textures sur un container.
    Je m'explique : j'ai un block qui est censé faire un peu comme les "tanks" de BuildCraft mais avec un Gui ; en gros on ouvre le gui et on peut mettre des sceaux de lait dedans, et il y a une barre qui indique le niveau de lait.
    Quand je met 2 sceaux dedans je peut en récupérer uniquement 2, donc le niveau de lait fonctionne, mais je ne sais pas comment update la texture.  :huh:
    J'ai essayé en ajoutant :

    ​@Override
    
    public void drawGuiContainerBackgroundLayer(float f, int i, int j) 
    {
    GL11.glColor4f(1F, 1F, 1F, 1F);
    this.mc.getTextureManager().bindTexture(texture);
    int x = (this.width - this.xSize) / 2;
    int y = (this.height - this.ySize) / 2;
    this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize);
    this.drawTexturedModalRect(x, y, 61, 79, 16, (int) c.MilkLevel/142);
    //TEST d'affichage barre this.drawTexturedModalRect(61, 6, 176, 0, 16, 7);
    }
    

    dans le GUI mais cela ne change rien (le c.MilkLevel est la valeur du lait, et je divise par 142 puisque 1 sceau = +1000 MilkLevel et la barre fait 74 pixels (donc 7.4 pixels par sceau) or 1000/142 = 7.4).  😞

    Par ailleurs, j'ai également tenté de mettre un texte indiquant le niveau de lait :

    ​
    @Override
    @SideOnly(Side.CLIENT)
    public void drawGuiContainerForegroundLayer(int par1, int par2)
    {
    int mValue = c.MilkLevel;
    String name = "Container";
    this.fontRendererObj.drawString(name, 8, this.ySize - 96 + 2, 4210752);
    this.fontRendererObj.drawString(mValue + "/10000 L Milk", 79, 6, 4210752);
    }
    

    mais il ne fonctionne pas non plus.  😞

    Vidéo + Texture du GUI : 
    Vidéo ICI  (sur mon site de fichiers, je ne voulais pas la publier sur YouTube pour ça)

    Merci de votre aide, 
    Valou3433



  • Il faut utiliser la fonction updateGui dans ce cas ^^



  • updateGui ? et où est cette fonction ? comment et où je l'appelle ?


  • Administrateurs

    Regarde le four.



  • J'ai regardé ces 4 classes :

    • GuiFurnace
    • ContainerFurnace
    • BlockFurnace
    • TileEntityFurnace
      et je n'ai toujours pas trouvé la méthode. C'est moi qui doit être mauvais, ou alors je n'ai pas regardé au bon endroit ? Il y aurait d'autres classes pour update le four ?


  • updateGui() tu peux l'appelé de tout ce qui est extends de GuiScreen (si je dis pas de bétise), va dans GuiScreen et recherche updateGui() si tu veux ^^

    PS. J'suis rapide pour répondre 😮



  • Merci de cette réponse rapide, mais cette méthode n'existe toujours pas dans la class GuiScreen 


    Il y a bien la méthode updateScreen() mais elle est vide par défaut et le commentaire dit qu'elle est appelée par la boucle principale, donc normalement ce n'est pas a moi de l'appeler...



  • Je ne te demande pas de l'appeler mais de l'override (sais plus l'écrire >.<)
    Dans ton code tu fais :

    @Override
    
    public void updateScreen(){
    System.out.println("Je suis content ^^");
    }
    


  • Ok mais je met quoi dans la méthode ? Le même code que dans mon drawGuiContainerBackgroundLayer() ?

    ​@Override
    
    public void drawGuiContainerBackgroundLayer(float f, int i, int j) 
    {
    GL11.glColor4f(1F, 1F, 1F, 1F);
    this.mc.getTextureManager().bindTexture(texture);
    int x = (this.width - this.xSize) / 2;
    int y = (this.height - this.ySize) / 2;
    this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize);
    this.drawTexturedModalRect(x, y, 61, 79, 16, (int) c.MilkLevel/142);
    //TEST d'affichage barre this.drawTexturedModalRect(61, 6, 176, 0, 16, 7);
    }
    

    EDIT : Je viens de tester comme ça et ça ne marche tjrs pas…
    EDIT 2 : J'ai regardé en plus la class GuiFurnace et updateScreen() n'est pas présente...


  • Administrateurs

    drawGuiContainerBackgroundLayer est appelé à chaque tick, donc ce n'est pas ici le problème.
    Il faut regarder dans le container.
    https://github.com/FFMT/Privatizer/blob/master/privatizer_src/fr/mcnanotech/privatizer/common/ContainerPrivateFurnace.java#L44-L98



  • D'accord merci, j'ai ajouté dans mon container ces trois méthodes là :

    ​@Override
    
    public void addCraftingToCrafters(ICrafting crafting)
    {
    super.addCraftingToCrafters(crafting);
    crafting.sendProgressBarUpdate(this, 0, this.c.MilkLevel);
    }
    public void detectAndSendChanges()
    {
    super.detectAndSendChanges();
    
    for(int i = 0; i < this.crafters.size(); ++i)
    {
    ICrafting icrafting = (ICrafting)this.crafters.get(i);
    
    if(this.lastMilkLevel != this.c.MilkLevel)
    {
    icrafting.sendProgressBarUpdate(this, 0, this.c.MilkLevel);
    }
    }
    
    this.lastMilkLevel = this.c.MilkLevel;
    }
    
    @SideOnly(Side.CLIENT)
    public void updateProgressBar(int id, int value)
    {
    this.c.MilkLevel = value;
    }
    

    Maintenant le texte indiquant la valeur du lait fonctionne, la barre toujours pas (mais je pense que c'est juste une erreur de coordonées dans l'image, puisqu'on en voit un bout sur le côté) mais maintenant on ne peut plus mettre de sceau de lait/ sceau vide dans le container, il ne se passe rien ! Pour voir que le texte marchait, j'ai du regarder sur un que j'avais posé avant et qui avait gardé en NBTTag sa valeur de lait…
    Image :


  • Administrateurs

    Il faudrait le code complet (gui + container + tile entity + bloc).
    En passant, respecte la convention Java (pas de majuscule début d'un nom de variable) car c'est plus simple pour les repérer.



  • Le message est je trouve trop gros ; j'essaierai de poster les classes sur un site externe la prochaine fois mais j'hésite : GitHub mais je n'ai pas de compte et à la base c'est plutôt pour du développement communautaire je trouvais inutile de me créer un compte juste pour ça ou le mettre sur mon site fichiers par exemple mais la coloration du language n'y est pas (http://files.olympe.in/java/GuiMilkContainer.java).

    EDIT : J'ai tout mis sur GitHub, voir le message suivant.
    EDIT 2 : Je n'avais pas remarqué il reste des commentaires dans le code j'ai oublié de les supprimer avant de les poster n'y faites pas attention



  • GitHub sert à tout le monde. Si ça ne te sert pas pour le dev collaboratif ça te servira au moins comme cloud dédié au code.

    Envoyé de mon iPhone en utilisant Tapatalk



  • Voila j'ai tout mis sur GitHub. Liens :


  • Administrateurs

    Le problème m'a l'air de venir de la fonction transferStackInSlot, regarde dans le coffre ou dans le four.
    Pour l'affichage, c'est surement la texture comme tu l'as dit.



  • J'ai essayé avec ça :

    ​ @Override
    
    public ItemStack transferStackInSlot(EntityPlayer p, int slotN)
    {
    ItemStack itemstack = null;
            Slot slot = (Slot)this.inventorySlots.get(slotN);
    
            if (slot != null && slot.getHasStack())
            {
                ItemStack itemstack1 = slot.getStack();
                itemstack = itemstack1.copy();
                if (itemstack1.stackSize == 0)
                {
                    slot.putStack((ItemStack)null);
                }
                else
                {
                this.mergeItemStack(itemstack1, c.getSizeInventory(), this.inventorySlots.size(), true);
                    slot.onSlotChanged();
                }
            }
    
            return itemstack;
    }
    

    Ça marche toujours pas… Et je ne comprend pas pourquoi l'ajout des trois méthodes précédentes aurait pu causer un problème à ce niveau...


  • Administrateurs

    Je ne vois pas d'où vient le problème dans ce cas 😕



  • Ok, pas grave j'essaierai de résoudre ça tout seul, ou si quelqu'un d'autre a une idée qu'il n'hésite pas. :s  Merci quand même  😄



  • C'est bon j'ai réussi ! En fait il fallait juste ajouter la méthode :

    ​c.deleteBucketAndModifyLevel();
    

    au milieu de detectAndSendChanges :

    ​@Override
    
    public void detectAndSendChanges()
    {
    super.detectAndSendChanges();
    c.deleteBucketAndModifyLevel();
    for(int i = 0; i < this.crafters.size(); ++i)
    {
    ICrafting icrafting = (ICrafting)this.crafters.get(i);
    
    if(this.lastMilkLevel != this.c.milkLevel)
    {
    icrafting.sendProgressBarUpdate(this, 0, this.c.milkLevel);
    }
    }
    
    this.lastMilkLevel = this.c.milkLevel;
    }
    

    Si sa intéresse quelqu'un, les classes sont sur GitHub, à la même adresse. 
    EDIT : J'ai également résolu le pb de texture, c'est en fait que je ne sais pas faire une addition/soustraction.