Slick2d - Leçons 10-19

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

19 April 2015 08:57 Slick2d - Leçons 10-19 Java, Jeux, Slick2d, Tutorial

Dans la leçon précédente nous avons vu comment faire une animation qui suit un courbe de bézier, pour rendre notre combat plus dynamique. Mais les animation se déclenchais en même temps pour le joueur et le monstre. Aujourd'hui on va voir comment résoudre ce problème à l'aide de listener.

Préparation ::  Listener ?

Qu'est-ce qu'un Listener ? Un listener c'est quelque chose qui écoute un événement, lorsque l'événement ce produit, alors on appel l'écouteur, c'est à dire le listener. C'est déjà ce qu'on utilise pour la gestion du clavier et de la manette.

J'ai fais évoluer SlickUtils, dans sa version 1.2, j'ai ajouté une interface AnimationListener et par la même la classe PathAnimation à évolué pour permettre d'y ajouter des points d'écoutes. PathAnimation a maintenant une méthode addListener(AnimationListener, long) permettant d'ajouter un point d'écoute à un certain point de l'animation. AnimationListener lui ne demande qu'une seul méthode on() qui sera appeler au point que l'on a demandé. Vous l'aurez compris, si vous n'avez pas la version 1.2 de SlickUtils, mettez-vous à jour.

Quel point d'écoute définir ? C'est un peu en fonction de ce que vous voulez. Moi j'ai choisis 2 points d'écoute pour le joueur.

  1. Quand le joueur arrive à la moitié de son attaque, je calcul les dégâts qu'il fait et je les assigne au monstre.
  2. Quand le joueur arrive à la fin de son mouvement d'attaque, je calcul si le monstre est mort et j'en déduis la suite du combat en fonction de la commande du joueur.

Callback Animation

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

22 March 2015 09:07 Slick2d - Leçons 10-19 Java, Jeux, Slick2d, Tutorial

Suite et toujours pas la fin sur les combats au tour par tour. Dans l'article précédent nous avons vu comment ajouter un système de commande pour traiter les attaques et défense lors du combat. Mais plusieurs problèmes ce soulevaient alors et voici ceux qu'on va résoudre aujourd'hui :

  • Non réinitialisation des pv des monstres.
  • Le combat est très statique et manque d'animation

Réinitialiser les points de vie du monstre.

On m'as demandé dans les commentaires, et plusieurs fois par mail, comment rappeler la méthode init(). Même si on pourrait, il ne faut pas. Sans rentrer dans les détails, la méthode init() sert à initialiser les ressources (image, son, contrôleur, etc..) nécessaires à la boucle, et si on la rappelle, on recharge encore une fois les ressources. Parfois ce n'est pas gênant, mais bien souvent c'est le cas. Prenons le cas d'une image, elle est chargée avec un objet java mais également dans la ram de votre carte graphique, n'oublions pas que Slick2D utilise OpenGL. Si l'objet java n'est plus référencé, java va le supprimer de votre mémoire, mais java ne peu pas savoir que image est également dans la ram de la carte graphique et va y rester ! Bien sur qu'il est possible de libérer cette mémoire, mais il faut l'indiquer à Slick2D.

Alors comment est-ce que l'on fait donc hein ? On utilise la méthode enter() qui est définit dans l'interface GameState on peu donc la surcharger dans nos boucles. Cette méthode est appelée quand on entre dans une boucle de jeux.

Code :: enter()

Ajoutons la méthode enter à notre BattleGameState.

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

22 February 2015 09:08 Slick2d - Leçons 10-19 Java, Jeux, Slick2d, Tutorial

Dans l’article précédent nous avons vus comment lancer de manière aléatoire des combats. Mais ces combats étaient vide. Nous allons voir comment les remplir.

Préparation.

Dans notre précédent article nous avons simplement fait un affichage mais nous n'avons pas cherché à séparer le code en plusieurs classes. Il faut le faire, qu'avons nous dans notre écran de combat ?

  • un joueur
  • un monstre

Nous devons donc ajouter  deux classes, Player et Monster. Mais nous avons déjà une classe Player qui existe, celle qui est utilisé dans la carte, nous l'avons vu, nous n'affichons pas le joueur de la même manière dans les combat que dans la carte, ce n'est donc pas les mêmes classes.

Pour simplifier le code je vais préfixé par Map toute les classes utilisées dans le MapGameState et par Battle toutes les classes utilisées dans BattleGameState. Il serait bien sur mieux d'utiliser des packages mais cela compliquerai les explications dans le présent article.

Code :: Séparation en objet

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

11 January 2015 08:52 Slick2d - Leçons 10-19 Java, Jeux, Slick2d, Tutorial

Voici certainement le tuto qu'on m'as le plus demandé ! Nous allons faire des combats. Je vous vois venir vous espérez déjà des combats en temps réel comme dans un jeu d'Action - Aventure, mais ce n'est pas pour tous de suite. Nous allons commencé doucement par les combat au tour par tour dans l'esprit des classiques J-Rpg. En préambule, il est impératif d'avoir lu et bien compris les leçons 10 et 11 sur la séparation en objet et la précédente leçon sur les phases de jeux.

Préparation :: Mise en place des boucles.

Si vous avez bien compris la leçon précédente, vous en aurez déduit que l'écran de combat sera une phase de jeux supplémentaire qui sera lancé de manière aléatoire depuis l'écran de jeu (celui qui contiens la carte).

Qu'allons nous avoir besoin dans ce nouvel écran de jeu ? Une boucle de jeu contenant un joueur, un ou plusieurs ennemi, afficher un fond, et donner des ordres de combat.

  • La boucle de jeu nous avons déjà vu comment en faire une, ici je l’appellerai BattleStateGame, elle fait logiquement suite à MainScreenStateGame et MapGameState.
  • Pour le joueur c'est plus compliqué, le joueur n'est pas le même que celui que nous utilisons depuis le début. En effet la méthode d'affichage n'est absolument pas adapté à un écran de combat comme nous l'imaginons. Il va falloir le retravailler.
  • Afficher un fond on sais faire on l'as vu sur l'écran d'introduction dans la leçon précédente.
  • Afficher un monstre, c'est simplement afficher un sprite, comme on le fait depuis la leçon 3.
  • Pour recevoir les ordres, je vous propose pour l'instant une solution simple, l'appui d'une touche donnera l'ordre à exécuter. par exemple "A" pour Attaquer, "F" pour Fuir, "M" pour magie, etc... je préviens on ne verra pas tous aujourd'hui.

Code :: BattleGameState

Pour l'instant je me contente d'un nouvel écran qui ne fait strictement rien, c'est à dire il affichera un écran noir et à l'appui d'une touche nous retournerons à l’écran de carte. En gros c'est quelque chose d'assez proche de notre écran de titre que nous avons vu dans l'exercice précédent.

Slick2d, leçon 15 :: Les phases de jeux

14 December 2014 08:10 Slick2d - Leçons 10-19 Java, Jeux, Slick2d, Tutorial

Aujourd'hui je vais vous présenter comment faire une succession d'écran avec Slick2D. On m'a contacter plusieurs fois en me demandant comment ouvrir une fenêtre Slick2D à partir d'une autre fenêtre. Et bien ne cherchez pas ce n'est simplement pas possible. Je tiens à dire que je voulais faire ce tuto en tous dernier, mais les multiples mails que j'ai reçu me l'on fait faire plus tôt.

Préparation

Que voulons nous faire ? Afficher un écran d'introduction qui permettent de lancer le jeu à l'appui d'une touche, n'importe laquelle pour faire simple ! Pour faire cet écran principal, j'ai cherché et trouvé une joli image sur OpenGameArt.

tuto-slick2d-079-fond

Théorie

Comme nous l'avons vu dans le tous premier Tutorial, un jeu est une boucle infini entre l'affichage et la mise à jour. Pour obtenir notre succession il suffit de faire deux boucle de jeu et de passer de l'un à l'autre.

tuto-slick2d-080-boucle-de-jeu