9.1 HUD
Téléchargement fichiers référence desktop.zip core.src.zip core.assets.zip
L'interface graphique, rassemble les composantes essentielles à la compréhension du jeu, mais qui n'existe pas dans le monde jeu. En particulier, nous désignons le tableau de bord HUD (Head-up display) comme l'ensemble des informations affichées en périphérie de l'écran et renseignant le joueur concernant le score, points de vie de son personnage, nombre de munitions restantes, etc.
^1
Interface graphique Secret of ManaAfin de maintenir le tableau de bord à l'écran, il est avantageux d'utiliser une camera secondaire fixe différente de celle qui suit le personnage. Par la suite, il est simplement question d'afficher le résultat des deux caméras l'un par-dessus l'autre.
Étapes à suivre
- créez la classe
HealthBar
utilise pour représenter la barre de vie
- Utilisez deux textures pour afficher le conteneur et le contenu de la barre de vie.
- Utilisez la classe
TextureRegion
afin d'afficher une région proportionnelle aux nombres de points de vie restant à l'avatar- à l'intérieur de la classe
HUD
- créez la camera responsable pour le rendu de l'interface
- créez une nouvelle instance de
SpriteBatch
réservé à l'interface- Incorporez l'élément
HealthBar
au tableau de bord- incorporez l'interface à l'intérieur de
Game
/* HealthBar.java */
package com.tutorialquest.ui;
// import ..
public class HealthBar {
private TextureRegion[][] healtBarTextures;
private Texture hearthTexture;
private float fillAmount = 1;
public HealthBar(){
// Chargement des textures
healtBarTextures = TextureRegion.split(new Texture("ui/health_spritesheet.png"), 64, 16);
hearthTexture = new Texture("objects/heart_icon.png");
}
public void render(SpriteBatch spriteBatch, Vector2 position)
{
spriteBatch.begin();
// Affichage de l'arrière (Conteneur)
spriteBatch.draw(
healtBarTextures[0][0],
position.x,
position.y,
64,
16);
// Création de la région proportionnelle
// a la valeur de `fillAmount`
TextureRegion fillRegion = new TextureRegion(
healtBarTextures[0][1],
0,
0,
(int) (healtBarTextures[0][1].getRegionWidth() * fillAmount),
healtBarTextures[0][1].getRegionHeight());
// Affichage du contenu (Contenu)
spriteBatch.draw(
fillRegion,
position.x,
position.y,
fillRegion.getRegionWidth(),
fillRegion.getRegionHeight());
// Affichage de l'icône
spriteBatch.draw(
hearthTexture,
position.x - 4,
position.y,
16,
16);
spriteBatch.end();
}
// Mise à jour du bar de vie proportionnellement aux points de vie restants
public void onAvatarHealthChanged(Character character) {
fillAmount = character.health / character.maxHealth;
}
}
/* HUD.java */
package com.tutorialquest.ui;
// import ..
public class HUD {
// Création d'une camera secondaire pour l'interface
private OrthographicCamera camera;
// Création du SpriteBatch
private SpriteBatch spriteBatch = new SpriteBatch();
// Création de la bar de vie
private HealthBar healthBar = new HealthBar();
public float getScaledWidth(){
return Game.VIEWPORT_WIDTH * camera.zoom;
}
public float getScaledHeight(){
return Game.VIEWPORT_HEIGHT * camera.zoom;
}
public HUD() {
// Configuration de la caméra (dimensions + zoom)
camera = new OrthographicCamera(
Game.VIEWPORT_WIDTH,
Game.VIEWPORT_HEIGHT);
camera.zoom = 1f/4f;
}
public void update(float deltaTime) {
camera.update();
}
public void render() {
spriteBatch.setProjectionMatrix(camera.combined);
Vector2 position;
// Puisque la camera désigne le centre de l'écran, calcul de la position dans le coin haut à gauche
position = new Vector2(
camera.position.x - (getScaledWidth()/2) + 8 ,
camera.position.y + (getScaledHeight()/2) - 12);
// Affichage de la barre de vie
healthBar.render(
spriteBatch,
position);
}
public void onAvatarHealthChanged(Character character) {
healthBar.onAvatarHealthChanged(character);
}
}
/* Game.java */
package com.tutorialquest;
// AJOUT:
import com.tutorialquest.ui.HUD;
// import ...
public class Game extends ApplicationAdapter {
// ...
// AJOUT:
public static HUD hud;
@Override
public void create() {
Gdx.graphics.setWindowedMode(VIEWPORT_WIDTH, VIEWPORT_HEIGHT);
// AJOUT:
hud = new HUD();
}
@Override
public void render() {
GLUtils.glClearColor(CORNFLOWER_BLUE);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
// ...
// AJOUT:
hud.update(Gdx.graphics.getDeltaTime());
// ...
// AJOUT:
hud.render();
}
}