17.5. Appeler des renforts
Minions
![](/assets/img/boss-state-minions.7f4373b6.gif)
Dans cet état, le boss fait apparaître un groupe d'ennemi pour attaquer le joueur. Ce changement est facile à réaliser cependant nous devons modifier la table de récompenses LootTable
des ennemis puisque nous ne voulons pas créer une nouvelle clé Boss Key
durant le boss lui-même.
Étapes à suivre
- ajoutez l'animation SHOOT pour le boss.
- ajoutez une la classe
MinionsState
- dans la méthode
enter
créez les ennemis.- réinitialiser la table de récompenses de l'ennemi.
/* Boss.java */
package com.tutorialquest.entities.boss;
// import ..
public class Boss extends Character {
// ...
public void initStateMachine(){
// ...
// AJOUT:
stateMachine.addState(
new BossState.MinionsState(
this,
stateMachine,
BossState.STATE_MINIONS,
0.5f,
1f,
BossState.STATE_IDLE),
false);
}
public void initSprite() {
// ...
// AJOUT:
sprite.addAnimation(
SpriteUtils.SHOOT,
AnimatedSprite.DEFAULT_FRAME_LENGTH,
Animation.PlayMode.LOOP,
sprite.frames[3][0],
sprite.frames[3][1],
sprite.frames[3][2],
sprite.frames[3][3],
sprite.frames[3][4],
sprite.frames[3][5]
);
}
@Override
// AJOUT:
// Réécriture de la méthode playAnimation
// afin que l'animation SHOOT prenne préséance.
public void playAnimation(
int anim,
boolean reset,
boolean force)
{
if(!force)
{
if (
anim != SpriteUtils.SHOOT &&
stateMachine.currentState.id == BossStateUtils.STATE_MINIONS) return;
}
sprite.play(anim, reset);
}
}
/* MinionsState.java */
package com.tutorialquest.entities.boss;
// import ..
public class MinionsState extends BossState {
public static final float PROJECTILE_DISTANCE = 4f;
public static final int NUM_MINIONS = 3;
public MinionsState(Boss boss, StateMachine stateMachine, int id, float probability, float timeLimit, int timeoutState) {
super(boss, stateMachine, id, probability, timeLimit, timeoutState);
}
@Override
public String getName() {
return "Minions";
}
@Override
public void enter() {
super.enter();
boss.playAnimation(Boss.SpriteUtils.SHOOT, true, true);
for (int i = 0; i < NUM_MINIONS; i++) {
boss.direction.setToRandomDirection();
Enemy enemy;
Game.level.add(
enemy = new Enemy(
new Vector2()
.add(boss.direction)
.scl(PROJECTILE_DISTANCE)
.add(boss.position))
);
// réinitialiser la table de récompenses de l'ennemi
enemy.lootTable = new LootTable();
}
}
}