Slick2d, leçon 21 :: Les combats aux tour par tour (6/6)

12 septembre 2016 09:30 Slick2d - Leçons 20-29 Java, Jeux, Slick2d, Tutorial

Après une longue pause voici enfin le 6ieme et dernier article sur les combats aux tour par tour. Dans celui-ci nous verrons comment changer la musique au début et en fin de combat. Cette méthode permet également de déclencher des "choses" quand on change d'état. Comme cela fait un moment que je n'ai pas écris de tuto, il se peut que le style change un peu, les fautes d'orthographes resterons.

Actuellement la musique se charge au lancement du jeux et ne change plus tout au long du jeux. Nous allons voir comment changer cela.

Préparation

J'ai trouvé quelques musiques sur OpenGameArt, celle-ci pour le combat et celle-ci pour la victoire. Comme précédemment, il faut convertir les musiques en OGG.

Rappel

Comme nous avons vu dans la leçon 7, pour charger et lire une musique de fond il nous suffisait de faire cela dans une des méthodes inits :

@Override
public void init() {
  Music background = new Music("sound/lost-in-the-meadows.ogg");
  background.loop();
}

Code :: enter() // leave()

Pour que la musique ne se lance plus au démarrage du jeu, il nous suffit d'enlever l'appel à la méthode loop(). Puis de faire appel à cette méthode quand on entre dans un state et appeler la méthode stop() quand on le quite, mais comment ? Dans les GameState il est possible de surcharger les méthodes enter() et leave() qui sont chacune respectivement appelées quand on entre dans un state et qu'on le quitte.

Nous pouvons ainsi modifier notre MapGameState comme ceci :

// Classe : MapGameState
public class MapGameState extends BasicGameState {
  // ...
  private Music background;

  @Override
  public void init() {
    // ...
    this.background = new Music("sound/lost-in-the-meadows.ogg");
    // ...
  }

  @Override
  public void enter() {
    this.background.loop();
  }

  @Override
  public void leave() {
    this.background.stop();
  }

  // ...

Lire une musique une seule fois.

Nous pouvons utiliser exactement la même méthode pour la musique de combat. Mais on tombe sur un os si on souhaite lire une musique particulière une seule fois à la fin du combat. En effet si sur le leave du BattleGameState on joue la musique on aura l'impression que celle-ci se joue sur l'écran de la carte. Nous pourrions ajouter un nouveau game state ou on afficherait nos gain etc... Mais je vais plutôt vous montrer comment lire une musique une seule fois et ensuite changer de state.

Code

Pour cela nous allons modifier notre classe BattleController, qui je vous le rappel se charge entre autre de nous faire retourner à la carte en fin de combat. Actuellement pour quitter le combat nous faisont appel à ce code :

// permet de rtourner à la "carte"
this.game.enterState(MapGameState.ID);
// permet de désactiver les futures commande
this.mode = BattleCommand.NONE;

Nous allons remplacer ce code par ceci qui va nous permettre d'ajouter une pause de 5 secondes à la fin du combat :

// Classe : BattleGameState
public void quitBattle(final int nextState) {
  // création d'une pause dans un autre thread pour ne pas bloquer l'affichage
  new Thread(new Runnable() {
    @Override
    public void run() {
      try {
        // pause de 5 secondes
        Thread.sleep(5000);
      } catch (InterruptedException e) {
        throw new RuntimeException(e);
      }
      this.mode = BattleCommand.NONE;
      this.game.enterState(nextState);
    }
  }).start();
}

Pour lancer une musique une seule fois il faut utiliser la méthode play() sur la musique que l'on souhaite. Chargeons cette musique quand nous initialisons le controller :

//Classe :: BattleGameState
private Music victory;

public BattleController(BattlePlayer player, BattleEnnemy ennemy, StateBasedGame game) throws SlickException {
  // ...
  this.victory = new Music("sound/lively-meadow-victory-fanfare.ogg");
}

Et jouer la musique quand on gagne le combat :

// Classe : BattleGameState
private void endPlayerAttack() {
  if (ennemy.getPv() <= 0) {
    hud.addLog("Vous avez gagné !");
    victory.play();
    quitBattle(MapGameState.ID);
  } else {
    // ...
}

Pour aller plus loin

Comme toujours on peu faire mieux, ajouter des bruitages pendant le combat ou ajouter une musique en cas de défaite par exemple.

Je ne sais pas ce que je vous proposerai dans le prochain tuto ni quand est-ce qu'il arrivera. Je pense aborder les "entités" c'est un concept assez vague mais qui permet de mieux concevoir notre jeux.

Ressource :

par Shionn, dernière modification le 05 avril 2017 19:42
8 réflexions au sujet de « Slick2d, leçon 21 :: Les combats aux tour par tour (6/6) »
  • Lokposs 16 septembre 2016 20:35

    Merci pour ce chapitre :) ça fait plaisir de te revoir :D Personnellement j'attends avec impatience le chapitre sur les Entités ! J'espère pouvoir comprendre comment le personnage peut parler avec des Personnages non-joueurs par exemple :)

  • Shionn 17 septembre 2016 10:30

    Salut ;)

    Oui cela fait du bien de le pondre enfin. Sinon on me demande souvent comment mettre des pnj, mais c'est de la pure algorithmie. vous avez toutes les techniques en main pour le faire. C'est d’ailleurs un problèmes mes tutos actuel parle plus d'algorithmie que de technique de jeux.

    Techniquement pour faire des pnjs il faut savoir :

    • afficher un personnage : c'est comme pour le joueur
    • définir un pnj : cela peu tre fait dans tiled avec les propriétées des cartes, un peu comme dans les triggers.
    • capter un événement clavier/souris/manette : comme dans le combat ou le déplacement
    • déterminer l'objet avec lequel on souhait interagir le plus proche : c'est de la géométrie je vous renvoie à vos cours du collège
    • afficher du text : on a vue plusieurs fois

    Franchement je vois pas ce qui vous manque pour faire des pnjs ?

  • Ultraime 19 septembre 2016 12:54

    Moi c'est le Pathfinding que j'attend avec impatience :D

  • Shionn 19 septembre 2016 13:03

    Ha oui, j'avais oublié ca.

  • Otruch 27 octobre 2016 02:29

    Bonjour,

    je tiens à vous remercier pour ce tutoriel très instructif, je vois que le dernier post date de septembre 2016, je vais peut être avoir la chance de pouvoir continuer vos tutos.

    Quand vous parlez de concept "entités", dites vous simplement coder proprement en séparant couche métier de la vue ou est-ce une particularité de slick ? Je vois une classe entity avec juste une méthode dump, qui permettrait apparemment de décrire sa classe en XML, est-ce un rapport avec le cours ?

    Je vous remercie, au fur et à mesure de nos lectures, on apprend des fonctionnalités qui nous simplifient encore plus la vie.

  • Shionn 27 octobre 2016 15:50

    Cela peu se rapprocher du modèle MVC, mais ce n'est pas vraiment cela. bizarrement je n'ai jamais vu d'application du MVC au jeux vidéo, cela doit cependant bien exister.

    De ce que j'en ai compris, les entités dans le monde du jeux, c'est une approche qui permet justement de séparer la logique du "monde" et celle du "jeux". L'approche générale est la définition de l’ensemble des "entitée" du jeux sous forme d'un arbre d'objet. il faut répondre à la question "Qu'est ce que notre jeux" ? Un monde composer de carte ou un joueur se balade pour affronter des monstres.. (en gras ce que je détecte comme des entitées)

    Puis on met ces objet sous forme d'arbre :

    Monde
    |-Cartes[]
    |  |-Monstre[]
    |
    |-Joueur
    

    Enfin chaque objet est capable de déléguer a ces enfants chaque appel de méthode. par exemple l'update du monde déclenche l'appel à l'update de joueur et des cartes elles même déclenchant l'appel au monstre...

  • Otruch 27 octobre 2016 22:25

    Ah oui je vois, l'idée est de faire un minimum d'init, update et render dans le State courant, un simple appel à la racine met à jour tous les enfants et sous enfants. Je suis étudiant en informatique et j'ai d'assez bonnes bases en conception pour reproduire un tel fonctionnement. Merci à vous !

  • Shionn 02 novembre 2016 09:09

    Non c'est une conséquence et non l'idée de départ. L'idée de départ est d'organisé les objet de son monde sous forme d'un arbre, ensuite cet arbre est le même pour tous les states.

Laissez un commentaire

Vous pouvez utilisez du markdown pour la mise en forme

Votre adresse de messagerie ne sera pas publiée.

Temporairement, pour lutter contre les bots, il n'est pas permis de mettre http:// dans le commentaire.