10.1 Trésors
Téléchargement fichiers référence desktop.zip core.src.zip core.assets.zip
Très souvent dans les jeux de style RPG, lorsqu'un ennemi est vaincu, il est susceptible de laisser derrière des trésors ou des récompenses pour le joueur. Nous voulons ajouter cette fonctionnalité à notre jeu. Dans le but de pouvoir éventuellement ajouter d'autre type d'objets à collectionner comme de la nourriture ou encore des équipements, nous utiliserons la classe abstraite Collectible
comme classe de base pour nos items dans le niveau.
Étapes à suivre
- ajoutez la méthode
onDefeated
à l'intérieur deCharacter
dans lequel on laisse tomber les trésors lorsque l'ennemi est vaincu- ajoutez la classe
Collectible
qui hérite dePhysicalObject
- à l'intérieur ajoutez la méthode
collect
qui sera surcharge par les différents types de collectible- ajoute la classe
Money
qui hérite DeCollectible
- ajoute la méthode
updateMoney
à l'intérieur deCharacter
/* Collectible.java */
package com.tutorialquest.entities;
// import ..
public class Collectible extends PhysicalObject {
protected Sprite sprite;
private List<PhysicalObject> collisionResults;
public enum Type
{
Health,
Money,
Item
}
public Collectible(Vector2 position) {
super(position);
// Ajout d'une boîte de collision
// pour permettre à l'avatar de ramasser
collider = new Collider(
new Vector2(8, 8),
Collider.FLAG_COLLECTIBLE);
collider.origin.set(4, 4);
collisionResults = new LinkedList<PhysicalObject>();
}
public void collect(Avatar avatar) {}
@Override
public void update(float deltaTime)
{
// Détection de la collision
collisionResults.clear();
if(collider.getObjectCollisions(
this,
0,0,
Collider.FLAG_AVATAR,
collisionResults))
{
collect((Avatar) collisionResults.iterator().next());
Game.level.remove(this);
return;
}
collider.update(position);
}
@Override
public void render(SpriteBatch spriteBatch) {
super.render(spriteBatch);
sprite.render(spriteBatch, position);
}
}
/* Money.java */
package com.tutorialquest.entities;
// import ..
public class Money extends Collectible {
public static final Vector2 SIZE = new Vector2(16, 16);
public static final float COPPER_COIN_VALUE = 1f;
private int value;
public Money(Vector2 position, float value)
{
super(position);
this.value = value;
String texturePath = "coin_copper.png";
sprite = new Sprite(texturePath, SIZE);
}
@Override
public void collect(Avatar avatar) {
avatar.updateMoney(value);
}
}
/* Avatar.java */
package com.tutorialquest.entities;
// import ..
public class Avatar extends Character
{
// ..
@Override
public void start() {
super.start();
// ...
// ADDED:
onMoneyChangedHandler.subscribe(Game.hud::onAvatarMoneyChanged);
}
// ..
}
/* Character.java */
package com.tutorialquest.entities;
// import ..
public abstract class Character extends PhysicalObject {
// ADDED:
public EventHandler<Character> onMoneyChangedHandler = new EventHandler<>();
// ADDED:
private float money = 0;
public float getMoney() {return money;}
public void updateMoney(float value)
{
money += value;
onMoneyChangedHandler.invoke(this);
if(money < 0)
money = 0;
}
// ...
}
/* Enemy.java */
package com.tutorialquest.entities;
// import ..
public class Enemy extends Character {
// ADDED:
public void onDefeated()
{
super.onDefeated();
Game.room.add(new Money(position, Money.COPPER_COIN_VALUE);
}
}
/* HUD.java */
package com.tutorialquest.ui;
// import ..
public class HUD {
// ADDED:
public void onAvatarMoneyChanged(Character character) {
moneyIndicator.OnAvatarMoneyChanged(character);
}
}
/* MoneyIndicator.java */
package com.tutorialquest.ui;
// import ..
public class MoneyIndicator {
// ..
private float value = 0;
// ..
public void OnAvatarMoneyChanged(Character character) {
value = character.getMoney();
}
}
Activité
Il est possible de réutiliser le même mécanisme afin de créer un item capable de restaurés les points de vie de notre personnage.
- créez une classe
Consumable
qui dérive la classeCollectible
- Tout comme
Money
, invoqués la méthodecollect
au contact avec le joueur.- Restaurez les points de vie du joueur à l'intérieur de la méthode
collect
- Mettez à jour l'interface graphique
HUD