18.2 Gagner la partie

La dernière étape est d'ajouter un indicateur lorsque le joueur gagne la partie. Comme lorsque la partie est perdue, nous voulons donner la possibilité au joueur de recommencer lorsqu'il gagne la partie.


Étapes à suivre

  1. Modifiez GameOverDisplay afin de permettre aussi d'afficher un texte de victoire.
  2. activez le texte de victoire lorsque le boss est vaincu dans la méthode onDefeat de Boss
/* GameOverDisplay.java */
package com.tutorialquest.ui;
// import ..

public class GameOverDisplay {

    // AJOUT:
    private static final String WIN_TEXT = "You win!";    
    // ...

    public void enable(boolean isDefeat)
    {
        this.enabled = true;
        text = isDefeat ? LOSE_TEXT : WIN_TEXT;
        elapsedTime = 0;
    }

    // ...
}
/* Boss.java */
package com.tutorialquest.entities.boss;
// import ..

public class Boss extends Character {
    // ...

    @Override
    public void onDefeated() {
        super.onDefeated();
        // AJOUT:
        Game.finish(false);
    }   
}
/* Game.java */
package com.tutorialquest;
// import ..

public class Game {
    // ...

    // MODIF:
    // public static void finish() 
    public static void finish(boolean isDefeat) 
    {
        finished = true;
        level.avatar.input.disable(-1);
        hud.input.disable(2);

        // MODIF:
        // hud.gameOverDisplay.enable();
        // hud.gameOverDisplay.enable(isDefeat);
    }
}

Étapes à suivre

Finalement, nous voulons ajouter une animation de célébration au personnage.

/* Game.java */
package com.tutorialquest;
// import ..


public class Game {
    // ...
    public static void finish(boolean isDefeat) {
        finished = true;
        level.avatar.input.disable(-1);
        hud.input.disable(2);
        hud.gameOverDisplay.enable(isDefeat);
        // AJOUT:
        if(!isDefeat) Game.level.avatar.win();
        
    }
}
/* Avatar.java */
package com.tutorialquest.entities;
// import ..

public class Avatar extends Character {

    public static class SpriteUtils {
        // ...
        // AJOUT:
        public static final int WIN = 16;
    }

    public void initSprite()
    {
        // ...
        
        // AJOUT:
        sprite.addAnimation(
            SpriteUtils.WIN,
            AnimatedSprite.DEFAULT_FRAME_LENGTH,
            Animation.PlayMode.NORMAL,
            sprite.frames[12][0]
        );

        sprite.play(SpriteUtils.IDLE_FRONT, true);
    }

    @Override
    public void playAnimation(int anim, boolean reset, boolean force) {
        if (!force) {
            if (attack != null) return;
            // AJOUT:
            if (Game.finished && anim != SpriteUtils.WIN) return;
            if (rollTime < ROLL_TIME_LIMIT) return;
        }

        super.playAnimation(anim, reset, force);
    }

    // AJOUT:
    public void win()
    {
        controlAxes.setZero();
        playAnimation(SpriteUtils.WIN, true, true);
    }
}