Aller au contenu
Wytrem

[1.8+] Une GUI de remerciements

Recommended Posts

Bonjour !

Suite à une demande d'aide, j'ai réalisé cette classe qui peut être utile pour remercier les contributeurs à un projet.

package net.minecraft.client.gui;


import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.ResourceLocation;

import org.lwjgl.Sys;
import org.lwjgl.opengl.GL11;


/**
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 * 
 * @author Wytrem 
 * 
 * http://forum.ironcraft.fr
 */
public class GuiCredits extends GuiScreen
{
	

	private GuiScreen parentScreen;
	private long updateCounter = 0L;
	private int maxNameWidth;
	private int trimmingWidth;
	private int neededHeight;
	private int creditsStartY;
	private int scaleFactor;
	private CreditsSettings settings;

	public GuiCredits(GuiScreen parent, CreditsSettings settings)
	{
		this.parentScreen = parent;
		this.settings = settings;
	}

	@Override
	public void initGui()
	{
		this.buttonList.add(new GuiButton(0, this.width - 20, 0, 20, 20, "X"));

		int temp;
		for (int i = 0; i < this.settings.credits.size(); i++)
		{
			Credit credit = this.settings.credits.get(i);

			temp = this.fontRendererObj.getStringWidth(credit.name);
			if (temp > this.maxNameWidth)
			{
				this.maxNameWidth = temp;
			}
		}

		// On calcule qu'est ce qu'il va falloir passer au FontRenderer.drawSplitString
		this.trimmingWidth = this.width - this.settings.PADDING_LEFT - this.settings.PADDING_RIGHT - this.settings.SPACE_BETWEEN_NAME_AND_ACHIEVEMENTS - this.maxNameWidth;

		// On calcule la hauteur totale
		for (int i = 0; i < this.settings.credits.size(); i++)
		{
			Credit credit = this.settings.credits.get(i);

			this.neededHeight += this.getDisplayHeight(credit) * this.fontRendererObj.FONT_HEIGHT + this.settings.SPACE_BETWEEN_CREDITS;
		}

		this.neededHeight += this.settings.SPACE_BETWEEN_CREDITS;

		// Ordonnée du premier crédit dessiné
		this.creditsStartY = (int) (this.settings.TITLE_Y + this.fontRendererObj.FONT_HEIGHT * this.settings.TITLE_FONT_SCALE + 5);

		// On récupère le scaleFactor pour le calcul du scissor
		this.scaleFactor = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight).getScaleFactor();
	}

	@Override
	public void updateScreen()
	{
		// Pour le défilement
		this.updateCounter++;

		// Si on a fait défiler tous les crédits
		if ((this.updateCounter) * this.settings.SPEED > this.neededHeight)
		{
			// On sort
			this.mc.displayGuiScreen(this.parentScreen);
		}
	}

	@Override
	public void drawScreen(int par1, int par2, float par3)
	{
		this.drawGeneralBackground();
		
		// Les crédits en arrière plan
		GlStateManager.pushMatrix();
		GL11.glEnable(GL11.GL_SCISSOR_TEST);
		GL11.glScissor(0, 0, this.mc.displayWidth, this.mc.displayHeight - this.creditsStartY * this.scaleFactor);
		GlStateManager.translate(0.0f, -(this.updateCounter + par3) * this.settings.SPEED, 0.0f);
		this.drawCredits();
		GL11.glDisable(GL11.GL_SCISSOR_TEST);
		GlStateManager.popMatrix();

		// Titre
		GlStateManager.pushMatrix();
		this.translateToStringPos(this.settings.TITLE, this.settings.TITLE_FONT_SCALE, this.width / 2, this.settings.TITLE_Y);
		GlStateManager.scale(this.settings.TITLE_FONT_SCALE, this.settings.TITLE_FONT_SCALE, 0.0f);
		this.drawString(fontRendererObj, this.settings.TITLE, 0, 0, this.settings.TITLE_COLOR);
		GlStateManager.popMatrix();

		super.drawScreen(par1, par2, par3);
	}

	/**
	 * Translate la matrice GL pour placer l'origine à l'endroit où il faut
	 * dessiner la chaîne de caractères donnée pour qu'elle apparaisse centrée
	 * sur l'abscisse passée en argument.
	 * 
	 * @param text La chaîne en question.
	 * @param scale Taille de la chaîne (définie avec un scale, <b>après</b>
	 *        calcul des positions par la présente).
	 * @param x Abscisse du point centre.
	 * @param y Ordonnée de la chaîne (ne subit aucun traitement avant passage
	 *        dans {@link GlStateManager#translate(float, float, float)}.
	 */
	protected void translateToStringPos(String text, float scale, int x, int y)
	{
		float stringWidth = this.fontRendererObj.getStringWidth(text) * scale;

		GlStateManager.translate(x - (stringWidth / 2f), y, 0.0f);
	}

	/**
	 * Dessine tous les crédits.
	 */
	protected void drawCredits()
	{
		int posX = this.settings.PADDING_LEFT;
		int posY = creditsStartY + this.settings.SPACE_BETWEEN_CREDITS * 2;

		for (int i = 0; i < this.settings.credits.size(); i++)
		{
			Credit credit = this.settings.credits.get(i);

			posY += this.drawCredit(credit, posX, posY) * this.fontRendererObj.FONT_HEIGHT + this.settings.SPACE_BETWEEN_CREDITS;
		}
	}

	/**
	 * Dessine le crédit passé en argument à la position donnée et renvoie le
	 * nombre de lignes qui on été nécessaires.
	 * 
	 * @param credit Le crédit en question.
	 * @param x Abscisse.
	 * @param y Ordonnée.
	 * @return Le nombre de lignes qui ont été nécessaires pour le dessiner.
	 */
	protected int drawCredit(Credit credit, int x, int y)
	{
		int height = getDisplayHeight(credit);

		int centeringY = (height > 1 ? ((height * this.fontRendererObj.FONT_HEIGHT - this.fontRendererObj.FONT_HEIGHT) / 2) : 0);

		this.drawString(this.fontRendererObj, credit.name, x, y + centeringY, credit.nameColor);
		this.fontRendererObj.drawSplitString(credit.achievements, x + maxNameWidth + this.settings.SPACE_BETWEEN_NAME_AND_ACHIEVEMENTS, y, this.trimmingWidth, credit.achievementsColor);

		return height;
	}

	/**
	 * @return Le nombre de lignes nécessaires pour déssiner ce crédit.
	 */
	protected int getDisplayHeight(Credit credit)
	{
		String[] linesArray = this.fontRendererObj.wrapFormattedStringToWidth(credit.achievements, this.trimmingWidth).split("\n");
		return linesArray.length;
	}

	/**
	 * Dessine l'arrière plan.
	 */
	protected void drawGeneralBackground()
	{
		this.drawRect(0, 0, this.width, this.height, 0xff000000);
	}
	
	public void actionPerformed(GuiButton button)
	{
		if (button.id == 0)
		{
			this.mc.displayGuiScreen(this.parentScreen);
		}
	}
	
	public static class Credit
	{
		public static final int DEFAULT_NAME_COLOR = 0xffffff;
		public static final int DEFAULT_ACHIEVEMENTS_COLOR = 0xeeeeee;

		public String name;
		public String achievements;
		public int nameColor;
		public int achievementsColor;

		public Credit(String n, String a)
		{
			this(n, a, DEFAULT_NAME_COLOR, DEFAULT_ACHIEVEMENTS_COLOR);
		}

		public Credit(String n, String a, int nameC, int achievementsC)
		{
			this.name = n;
			this.achievements = a;
			this.nameColor = nameC;
			this.achievementsColor = achievementsC;
		}
	}
}

package net.minecraft.client.gui;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import net.minecraft.client.gui.GuiCredits.Credit;

import org.apache.commons.io.FileUtils;

import com.google.gson.Gson;

/**
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 * 
 * @author Wytrem 
 * 
 * http://forum.ironcraft.fr
 */
public class CreditsSettings
{
	/**
	 * Distance entre le bord gauche de la fenêtre et le nom des gens crédités.
	 */
	protected int PADDING_LEFT = 10;

	/**
	 * Distance entre le bord droit de la fenêtre et les réalisations des gens
	 * crédités.
	 */
	public int PADDING_RIGHT = 10;

	/**
	 * Distance entre deux crédits.
	 */
	public int SPACE_BETWEEN_CREDITS = 10;

	/**
	 * Distance minimale entre le nom d'un credit et ses réalisations.
	 */
	public int SPACE_BETWEEN_NAME_AND_ACHIEVEMENTS = 10;

	/**
	 * Vitesse de défilement.
	 */
	public float SPEED = 0.5f;

	/**
	 * Texte du titre.
	 */
	public String TITLE = "Remerciements";

	/**
	 * Position Y du titre.
	 */
	public int TITLE_Y = 5;

	/**
	 * Coefficient multiplicateur de la taille de la police pour le titre.
	 */
	public float TITLE_FONT_SCALE = 2.0f;

	/**
	 * Couleur du titre.
	 */
	public int TITLE_COLOR = 0xf0c300;

	/**
	 * Liste des crédits.
	 */
	public ArrayList<Credit> credits = new ArrayList<Credit>();
	
	public String toJsonString()
	{
		return new Gson().toJson(this, CreditsSettings.class);
	}
	
	/**
	 * Utilisé pour aider la création de paramètres.
	 */
	public static class Builder
	{
		private CreditsSettings settings;
		
		public Builder()
		{
			this.settings = new CreditsSettings();
		}
		
		/**
		 * Lit un fichier contenant du JSON et instancie en conséquence l'ensemble des paramètres.
		 * @return L'objet Builder pour chaînage.
		 */
		public Builder fromJsonFile(File file) throws IOException
		{
			String content = FileUtils.readFileToString(file);
			
			this.settings = new Gson().fromJson(content, CreditsSettings.class);
			return this;
		}
		
		/**
		 * Lit un fichier contenant du texte et instancie en conséquence l'ensemble des paramètres.
		 * @return L'objet Builder pour chaînage.
		 */
		public Builder fromFile(String file) throws IOException
		{
			return fromInputStream(new FileInputStream(new File(file)));
		}
		
		/**
		 * Lit un flux et instancie en conséquence l'ensemble des paramètres.
		 * @return L'objet Builder pour chaînage.
		 */
		public Builder fromInputStream(InputStream input) throws IOException
		{
			BufferedReader reader = new BufferedReader(new InputStreamReader(input));
			
			String line;
			Credit currentReadingCredit = null;
			
			while ((line = reader.readLine()) != null)
			{
				if (line.startsWith("["))
				{
					if (currentReadingCredit != null)
					{
						// On enlève le dernier "\n"
						currentReadingCredit.achievements = currentReadingCredit.achievements.substring(0, currentReadingCredit.achievements.length() - 1);
						this.settings.credits.add(currentReadingCredit);
					}
					
					line = line.substring(1);
					
					if (line.endsWith("]"))
					{
						line = line.substring(0, line.length() - 1);
					}
					
					String[] explode = line.split(",");
					
					if (explode.length == 1)
					{
						currentReadingCredit = new Credit(explode[0], "");
					}
					else if (explode.length == 2)
					{
						currentReadingCredit = new Credit(explode[0], "", Integer.parseInt(explode[1]), Credit.DEFAULT_ACHIEVEMENTS_COLOR);
					}
					else if (explode.length == 3)
					{
						currentReadingCredit = new Credit(explode[0], "", Integer.parseInt(explode[1]), Integer.parseInt(explode[2]));
					}
					else
					{
						System.err.println("GuiCredits : cannot read line " + line);
					}
				}
				else
				{
					if (!line.equals(""))
						currentReadingCredit.achievements += line.replace("\\[", "[") + "\n";
				}
			}
			
			if (currentReadingCredit != null)
			{
				this.settings.credits.add(currentReadingCredit);
			}
			
			return this;
		}
		
		public Builder addCredit(String name, String achivement)
		{
			this.settings.credits.add(new Credit(name, achivement));
			return this;
		}

		public Builder addCreditWithNameColor(String name, String achivement, int nameColor)
		{
			this.settings.credits.add(new Credit(name, achivement, nameColor, Credit.DEFAULT_ACHIEVEMENTS_COLOR));
			return this;
		}

		public Builder addCreditWithColors(String name, String achivement, int nameColor, int achievementsColor)
		{
			this.settings.credits.add(new Credit(name, achivement, nameColor, achievementsColor));
			return this;
		}
		
		public void print()
		{
			//debug
			for (Credit cr : this.settings.credits)
			{
				System.out.println("--- " + cr.name + " ---");
				System.out.println("Text : " + cr.achievements);
				System.out.println("NameColor : " + Integer.toHexString(cr.nameColor));
				System.out.println("TextColor : " + Integer.toHexString(cr.achievementsColor));
			}
		}
		
		/**
		 * @return L'objet final des paramètres.
		 */
		public CreditsSettings build()
		{
			return this.settings;
		}
	}
}

Pour l'utiliser :

Depuis un fichier :

CreditsSettings settings = new CreditsSettings.Builder().fromFile("/home/wytrem/credits.txt").build();
this.mc.displayGuiScreen(new GuiCredits(this, settings));

Le format du texte à l'intérieur du fichier est le suivant :

[toto, 0xff0000, 0xcccccc]

Ceci est un remerciement à toto.

Il a vraiment fait du bon boulot. Son pseudo sera de couleur rouge et le texte de couleur grise.

[tata]

Ceci est un remerciement à tata.

Vous pouvez également le lire depuis un fichier contenant du JSON (préalablement obtenu via CreditsSettings.toJsonString()) :

CreditsSettings settings = new CreditsSettings.Builder().fromJsonFile("/home/wytrem/credits_json.txt").build();
this.mc.displayGuiScreen(new GuiCredits(this, settings));

Ou le fabriquer à la main :

CreditsSettings.Builder builder = new CreditsSettings.Builder();
builder.addCredit("Toto", "Beau boulot toto.");
builder.addCreditWithColors("Tata", "Beau boulot aussi, tata", 0x00ff00, 0xffaaaa);

this.mc.displayGuiScreen(new GuiCredits(this, builder.build()));


Quelques images :

08ANtnU.png

Tout ce qu'il y a de plus basique.

JOLsrGP.png

Un peu plus coloré, basé sur le GuiMainMenu...

N'hésitez pas à me signaler les améliorations/corrections possibles ! ;)

  • Upvote 6

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu aurais aussi pu passer par un fichier texte comme le GUI de fin du jeu ! tu rajoute des .replace() et il y a moyen de faire quelque chose de sympa aussi ^^ Mais là c'est jolie aussi

Edit: Ah et le bouton quitter à la fin, pourquoi ne pas le faire afficher une fois le défilement/générique terminé ? S'peut être sympa

Partager ce message


Lien à poster
Partager sur d’autres sites

La GUI se ferme automatiquement une fois le défilement terminé, j'ai laissé le bouton "X" en haut à droite parce que si jamais tu arrives sur la GUI par miss click ça peut être un peu énervant de devoir attendre jusqu'à la fin... x)

Pour l'enlever, il faut supprimer la ligne dans initGui :

this.buttonList.add(new GuiButton(0, this.width - 20, 0, 20, 20, "X"));

Partager ce message


Lien à poster
Partager sur d’autres sites

+1 C'est une bonne idée mais je pense que Wytrem pensait encore à ça : "Ah et le bouton quitter à la fin, pourquoi ne pas le faire afficher une fois le défilement/générique terminé ? S'peut être sympa"

Partager ce message


Lien à poster
Partager sur d’autres sites

Ah oui, j'étais toujours sur ça. x)

@TheAmateiis une idée pour le format de fichier ? Quelque chose du genre :

toto:Merci à toto.

tata:Merci à tata.

Ou un JSON ? ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

un JSON juste pour ça, arh nein, le format que tu propose est très bien, mais pour le multi ligne et si on veut utiliser des double points, fait un truc du style

[toto]

Merci a toto
Car je l'aime
Très très beaucoup

[tato]

Merci à tato
pas tati et pas tata, tato

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui mais plus difficile a configurer et tous juste pour des crédits, après tu choisis wyrtem ;) Mais ça va être plus compliqué pour toi quand même de faire tout un truc JSON je pense

Partager ce message


Lien à poster
Partager sur d’autres sites

Pourquoi ne pas faire une commande en multi, genre /projet et sa t'affiche le Gui Remerciements ? ^^

PS: C'était moi le gars que t'avais aidé pour sa xD

PS 2: Je suis repassé en 1.7 car la 1.8 je n'y arrive vraiment pas x)

Partager ce message


Lien à poster
Partager sur d’autres sites

Pourquoi ne pas faire une commande en multi, genre /projet et sa t'affiche le Gui Remerciements ? ^^

ça sortirait du simple cadre de la GUI, tu peux t'inspirer des commandes client déjà existantes pour créer le /projet.

PS: C'était moi le gars que t'avais aidé pour sa xD

PS 2: Je suis repassé en 1.7 car la 1.8 je n'y arrive vraiment pas x)

Normalement les codes sont sensiblement les mêmes. ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci beaucoup pour cette création, et surtout d'avoir mis à disposition le code source de celle-ci !

Ca m'aidera pour mon projet !

PS: Dis moi où je dois te citer, je le ferais.

Partager ce message


Lien à poster
Partager sur d’autres sites

:'( je suis en 1.7.10

Et il n'y a pasGlStateManager....

C'est là qu'intervient le GL11...

Derien.

package net.minecraft.client.gui;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.util.ArrayList;

import net.minecraft.client.renderer.Tessellator;

import net.minecraft.util.EnumChatFormatting;

import net.minecraft.util.ResourceLocation;

import org.lwjgl.Sys;

import org.lwjgl.opengl.GL11;

public class GuiCredits extends GuiScreen

{

private GuiScreen parentScreen;

private long updateCounter = 0L;

private int maxNameWidth;

private int trimmingWidth;

private int neededHeight;

private int creditsStartY;

private int scaleFactor;

private CreditsSettings settings;

public GuiCredits(GuiScreen parent, CreditsSettings settings)

{

this.parentScreen = parent;

this.settings = settings;

}

@Override

public void initGui()

{

this.buttonList.add(new GuiButton(0, this.width - 20, 0, 20, 20, "X"));

int temp;

for (int i = 0; i < this.settings.credits.size(); i++)

{

Credit credit = this.settings.credits.get(i);

temp = this.fontRendererObj.getStringWidth(credit.name);

if (temp > this.maxNameWidth)

{

this.maxNameWidth = temp;

}

}

// On calcule qu'est ce qu'il va falloir passer au FontRenderer.drawSplitString

this.trimmingWidth = this.width - this.settings.PADDING_LEFT - this.settings.PADDING_RIGHT - this.settings.SPACE_BETWEEN_NAME_AND_ACHIEVEMENTS - this.maxNameWidth;

// On calcule la hauteur totale

for (int i = 0; i < this.settings.credits.size(); i++)

{

Credit credit = this.settings.credits.get(i);

this.neededHeight += this.getDisplayHeight(credit) * this.fontRendererObj.FONT_HEIGHT + this.settings.SPACE_BETWEEN_CREDITS;

}

this.neededHeight += this.settings.SPACE_BETWEEN_CREDITS;

// Ordonnée du premier crédit dessiné

this.creditsStartY = (int) (this.settings.TITLE_Y + this.fontRendererObj.FONT_HEIGHT * this.settings.TITLE_FONT_SCALE + 5);

// On récupère le scaleFactor pour le calcul du scissor

this.scaleFactor = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight).getScaleFactor();

}

@Override

public void updateScreen()

{

// Pour le défilement

this.updateCounter++;

// Si on a fait défiler tous les crédits

if ((this.updateCounter) * this.settings.SPEED > this.neededHeight)

{

// On sort

this.mc.displayGuiScreen(this.parentScreen);

}

}

@Override

public void drawScreen(int par1, int par2, float par3)

{

this.drawGeneralBackground();

// Les crédits en arrière plan

GL11.glPushMatrix();

GL11.glEnable(GL11.GL_SCISSOR_TEST);

GL11.glScissor(0, 0, this.mc.displayWidth, this.mc.displayHeight - this.creditsStartY * this.scaleFactor);

GL11.glTranslatef(0.0f, -(this.updateCounter + par3) * this.settings.SPEED, 0.0f);

this.drawCredits();

GL11.glDisable(GL11.GL_SCISSOR_TEST);

GL11.glPopMatrix();

// Titre

GL11.glPushMatrix();

this.translateToStringPos(this.settings.TITLE, this.settings.TITLE_FONT_SCALE, this.width / 2, this.settings.TITLE_Y);

GL11.glScalef(this.settings.TITLE_FONT_SCALE, this.settings.TITLE_FONT_SCALE, 0.0f);

this.drawString(fontRendererObj, this.settings.TITLE, 0, 0, this.settings.TITLE_COLOR);

GL11.glPopMatrix();

super.drawScreen(par1, par2, par3);

}

/**

* Translate la matrice GL pour placer l'origine à l'endroit où il faut

* dessiner la chaîne de caractères donnée pour qu'elle apparaisse centrée

* sur l'abscisse passée en argument.

*

* @param text La chaîne en question.

* @param scale Taille de la chaîne (définie avec un scale, après

* calcul des positions par la présente).

* @param x Abscisse du point centre.

* @param y Ordonnée de la chaîne (ne subit aucun traitement avant passage

* dans {@link GlStateManager#translate(float, float, float)}.

*/

protected void translateToStringPos(String text, float scale, int x, int y)

{

float stringWidth = this.fontRendererObj.getStringWidth(text) * scale;

GL11.glTranslatef(x - (stringWidth / 2f), y, 0.0f);

}

/**

* Dessine tous les crédits.

*/

protected void drawCredits()

{

int posX = this.settings.PADDING_LEFT;

int posY = creditsStartY + this.settings.SPACE_BETWEEN_CREDITS * 2;

for (int i = 0; i < this.settings.credits.size(); i++)

{

Credit credit = this.settings.credits.get(i);

posY += this.drawCredit(credit, posX, posY) * this.fontRendererObj.FONT_HEIGHT + this.settings.SPACE_BETWEEN_CREDITS;

}

}

/**

* Dessine le crédit passé en argument à la position donnée et renvoie le

* nombre de lignes qui on été nécessaires.

*

* @param credit Le crédit en question.

* @param x Abscisse.

* @param y Ordonnée.

* @return Le nombre de lignes qui ont été nécessaires pour le dessiner.

*/

protected int drawCredit(Credit credit, int x, int y)

{

int height = getDisplayHeight(credit);

int centeringY = (height > 1 ? ((height * this.fontRendererObj.FONT_HEIGHT - this.fontRendererObj.FONT_HEIGHT) / 2) : 0);

this.drawString(this.fontRendererObj, credit.name, x, y + centeringY, credit.nameColor);

this.fontRendererObj.drawSplitString(credit.achievements, x + maxNameWidth + this.settings.SPACE_BETWEEN_NAME_AND_ACHIEVEMENTS, y, this.trimmingWidth, credit.achievementsColor);

return height;

}

/**

* @return Le nombre de lignes nécessaires pour déssiner ce crédit.

*/

protected int getDisplayHeight(Credit credit)

{

String[] linesArray = this.fontRendererObj.wrapFormattedStringToWidth(credit.achievements, this.trimmingWidth).split("\n");

return linesArray.length;

}

/**

* Dessine l'arrière plan.

*/

protected void drawGeneralBackground()

{

this.drawRect(0, 0, this.width, this.height, 0xff000000);

}

public void actionPerformed(GuiButton button)

{

if (button.id == 0)

{

this.mc.displayGuiScreen(new GuiSelectWorld(this));

}

}

public static class Credit

{

public static final int DEFAULT_NAME_COLOR = 0xffffff;

public static final int DEFAULT_ACHIEVEMENTS_COLOR = 0xeeeeee;

public String name;

public String achievements;

public int nameColor;

public int achievementsColor;

public Credit(String n, String a)

{

this(n, a, DEFAULT_NAME_COLOR, DEFAULT_ACHIEVEMENTS_COLOR);

}

public Credit(String n, String a, int nameC, int achievementsC)

{

this.name = n;

this.achievements = a;

this.nameColor = nameC;

this.achievementsColor = achievementsC;

}

}

}

Partager ce message


Lien à poster
Partager sur d’autres sites

Je ne comprends pas ou est-ce que l'on met ça :

CreditsSettings settings = new CreditsSettings.Builder().fromFile("/home/wytrem/credits.txt").build();
this.mc.displayGuiScreen(new GuiCredits(this, settings));

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est là qu'intervient le GL11...

Derien.

package net.minecraft.client.gui;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.util.ArrayList;

import net.minecraft.client.renderer.Tessellator;

import net.minecraft.util.EnumChatFormatting;

import net.minecraft.util.ResourceLocation;

import org.lwjgl.Sys;

import org.lwjgl.opengl.GL11;

public class GuiCredits extends GuiScreen

{

private GuiScreen parentScreen;

private long updateCounter = 0L;

private int maxNameWidth;

private int trimmingWidth;

private int neededHeight;

private int creditsStartY;

private int scaleFactor;

private CreditsSettings settings;

public GuiCredits(GuiScreen parent, CreditsSettings settings)

{

this.parentScreen = parent;

this.settings = settings;

}

@Override

public void initGui()

{

this.buttonList.add(new GuiButton(0, this.width - 20, 0, 20, 20, "X"));

int temp;

for (int i = 0; i < this.settings.credits.size(); i++)

{

Credit credit = this.settings.credits.get(i);

temp = this.fontRendererObj.getStringWidth(credit.name);

if (temp > this.maxNameWidth)

{

this.maxNameWidth = temp;

}

}

// On calcule qu'est ce qu'il va falloir passer au FontRenderer.drawSplitString

this.trimmingWidth = this.width - this.settings.PADDING_LEFT - this.settings.PADDING_RIGHT - this.settings.SPACE_BETWEEN_NAME_AND_ACHIEVEMENTS - this.maxNameWidth;

// On calcule la hauteur totale

for (int i = 0; i < this.settings.credits.size(); i++)

{

Credit credit = this.settings.credits.get(i);

this.neededHeight += this.getDisplayHeight(credit) * this.fontRendererObj.FONT_HEIGHT + this.settings.SPACE_BETWEEN_CREDITS;

}

this.neededHeight += this.settings.SPACE_BETWEEN_CREDITS;

// Ordonnée du premier crédit dessiné

this.creditsStartY = (int) (this.settings.TITLE_Y + this.fontRendererObj.FONT_HEIGHT * this.settings.TITLE_FONT_SCALE + 5);

// On récupère le scaleFactor pour le calcul du scissor

this.scaleFactor = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight).getScaleFactor();

}

@Override

public void updateScreen()

{

// Pour le défilement

this.updateCounter++;

// Si on a fait défiler tous les crédits

if ((this.updateCounter) * this.settings.SPEED > this.neededHeight)

{

// On sort

this.mc.displayGuiScreen(this.parentScreen);

}

}

@Override

public void drawScreen(int par1, int par2, float par3)

{

this.drawGeneralBackground();

// Les crédits en arrière plan

GL11.glPushMatrix();

GL11.glEnable(GL11.GL_SCISSOR_TEST);

GL11.glScissor(0, 0, this.mc.displayWidth, this.mc.displayHeight - this.creditsStartY * this.scaleFactor);

GL11.glTranslatef(0.0f, -(this.updateCounter + par3) * this.settings.SPEED, 0.0f);

this.drawCredits();

GL11.glDisable(GL11.GL_SCISSOR_TEST);

GL11.glPopMatrix();

// Titre

GL11.glPushMatrix();

this.translateToStringPos(this.settings.TITLE, this.settings.TITLE_FONT_SCALE, this.width / 2, this.settings.TITLE_Y);

GL11.glScalef(this.settings.TITLE_FONT_SCALE, this.settings.TITLE_FONT_SCALE, 0.0f);

this.drawString(fontRendererObj, this.settings.TITLE, 0, 0, this.settings.TITLE_COLOR);

GL11.glPopMatrix();

super.drawScreen(par1, par2, par3);

}

/**

* Translate la matrice GL pour placer l'origine à l'endroit où il faut

* dessiner la chaîne de caractères donnée pour qu'elle apparaisse centrée

* sur l'abscisse passée en argument.

*

* @param text La chaîne en question.

* @param scale Taille de la chaîne (définie avec un scale, après

* calcul des positions par la présente).

* @param x Abscisse du point centre.

* @param y Ordonnée de la chaîne (ne subit aucun traitement avant passage

* dans {@link GlStateManager#translate(float, float, float)}.

*/

protected void translateToStringPos(String text, float scale, int x, int y)

{

float stringWidth = this.fontRendererObj.getStringWidth(text) * scale;

GL11.glTranslatef(x - (stringWidth / 2f), y, 0.0f);

}

/**

* Dessine tous les crédits.

*/

protected void drawCredits()

{

int posX = this.settings.PADDING_LEFT;

int posY = creditsStartY + this.settings.SPACE_BETWEEN_CREDITS * 2;

for (int i = 0; i < this.settings.credits.size(); i++)

{

Credit credit = this.settings.credits.get(i);

posY += this.drawCredit(credit, posX, posY) * this.fontRendererObj.FONT_HEIGHT + this.settings.SPACE_BETWEEN_CREDITS;

}

}

/**

* Dessine le crédit passé en argument à la position donnée et renvoie le

* nombre de lignes qui on été nécessaires.

*

* @param credit Le crédit en question.

* @param x Abscisse.

* @param y Ordonnée.

* @return Le nombre de lignes qui ont été nécessaires pour le dessiner.

*/

protected int drawCredit(Credit credit, int x, int y)

{

int height = getDisplayHeight(credit);

int centeringY = (height > 1 ? ((height * this.fontRendererObj.FONT_HEIGHT - this.fontRendererObj.FONT_HEIGHT) / 2) : 0);

this.drawString(this.fontRendererObj, credit.name, x, y + centeringY, credit.nameColor);

this.fontRendererObj.drawSplitString(credit.achievements, x + maxNameWidth + this.settings.SPACE_BETWEEN_NAME_AND_ACHIEVEMENTS, y, this.trimmingWidth, credit.achievementsColor);

return height;

}

/**

* @return Le nombre de lignes nécessaires pour déssiner ce crédit.

*/

protected int getDisplayHeight(Credit credit)

{

String[] linesArray = this.fontRendererObj.wrapFormattedStringToWidth(credit.achievements, this.trimmingWidth).split("\n");

return linesArray.length;

}

/**

* Dessine l'arrière plan.

*/

protected void drawGeneralBackground()

{

this.drawRect(0, 0, this.width, this.height, 0xff000000);

}

public void actionPerformed(GuiButton button)

{

if (button.id == 0)

{

this.mc.displayGuiScreen(new GuiSelectWorld(this));

}

}

public static class Credit

{

public static final int DEFAULT_NAME_COLOR = 0xffffff;

public static final int DEFAULT_ACHIEVEMENTS_COLOR = 0xeeeeee;

public String name;

public String achievements;

public int nameColor;

public int achievementsColor;

public Credit(String n, String a)

{

this(n, a, DEFAULT_NAME_COLOR, DEFAULT_ACHIEVEMENTS_COLOR);

}

public Credit(String n, String a, int nameC, int achievementsC)

{

this.name = n;

this.achievements = a;

this.nameColor = nameC;

this.achievementsColor = achievementsC;

}

}

}

Je te remercie infiniment (même si j'avais trouvé une alternative en important GlStateManager) :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Je ne comprends pas ou est-ce que l'on met ça :

CreditsSettings settings = new CreditsSettings.Builder().fromFile("/home/wytrem/credits.txt").build();
this.mc.displayGuiScreen(new GuiCredits(this, settings));

Personnelement j'ai écrit ligne par ligne, comme ceci:

CreditsSettings.Builder builder = new CreditsSettings.Builder();

builder.addCredit("", "Lhiver venait de déposer ses derniers flocons pour enfin nous quitter.");

builder.addCredit("", "Tout était calme et paisible dans la comté de §cMula§f. Les enfants sortaient leur bicyclette, allaient se baigner et plusieurs parents commençaient leur premier barbecue.");

builder.addCredit("", "Cependant dans un laboratoire à quelques kilomètres de la ville, estimé au niveau 8 de danger, on testait de nouveaux produit sur des singes.");

builder.addCredit("", "Tout le monde se rappelle et se rappellera du 4 avril 2056. Les scientifique passaient une dernière fois avant les vacances voir leurs sujets mais malheureusement un des sujets infectés bondit de sa cage et alla mordre le scientifique. Les gardes étant incapables de faire face à la nouvelle épidémie furent eux aussi contaminés.");

builder.addCredit("", "S'en suivit la propagation dans toute la ville, puis dans les continents et finalement le monde entier. ZKA3 un virus qui rend les gens fous, leur donne une allure de zombies et une forte envie de tuer tout ce qui bouge");

builder.addCredit("", "Les derniers survivants, se réfugièrent dans un vaisseau spatial controlé par les disposeurs, une sorte dhumain plus intelligent daprès eux. Bref, pendant ton aventure tu fera surement leur connaissance.");

builder.addCredit("", "Voilà comment commence lhistoire de Hilium.");

builder.addCreditWithColors("", "Et ton aventure commence ici.", 0x00ff00, 0xffaaaa);

Je te remercie infiniment (même si j'avais trouvé une alternative en important GlStateManager) :)

Derien t'inquiète pas ! :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×