Le but de ce TP va être de réaliser un petit jeu à deux joueurs en Processing.
Dans ce jeu, l'objectif va être de détruire le chateau de l'adversaire avant qu'il ne détruise le votre.
Chaque joueur va à tour de rôle lancer un boulet de canon dans les airs en essayant de viser le chateau adverse.
Principe
Pour tirer, un joueur doit :
Maintenir enfoncé le bouton gauche de la souris
Définir l'angle et la force du tir à l'aide du viseur
Relacher la souris pour effectuer le tir
Le terrain peut être détruit
Attention, seul le haut du terrain est vulnérable, il faut attaquer le haut des montagnes
Le terrain derrière les chateaux est indestructible
Le TP
Commencez par créer un projet et ajoutez y tous les fichiers donnés (les fichiers pde et les fichiers images aussi)
Le code du jeu est toutefois très incomplet...
Ca va être à vous de le compléter !
Commencez par regarder attentivement le code et lire les descriptions des fonctions
La boucle Processing, le retour
Processing contient une boucle qui appelle indéfiniment la fonction draw()
Mais il y a d'autres fonctions que Processing appelle pour nous :
Les fonctions d'interaction avec l'utilisateur
Par exemple :
void mouseClicked()
{
// Le code que je met dans cette fonction sera executé dès
// que l'utilisateur clique avec la souris
}
Les joueurs seront matérialisés par un numéro : 1 et 2. La variable joueur_courant contiendra le numero du joueur qui joue en ce moment
Les chateaux des joueurs seront représentés par des petits chateaux dessinés dans la fenêtre graphique (fonction dessinerJoueur)
Ces chateaux ont une position, que les fonctions positionXDuJoueur(j) et positionYDuJoueur(j) nous renvoie
Chaque joueur aura 2 points de vie, stockés dans les variables PVJoueur1 et PVJoueur2
Des variables booléennes tir_en_cours et en_train_de_tirer nous indiquerons si le joueur a tiré ou est en train de viser
Le boulet de canon sera représenté par sa position en x et en y (pos_boulet_x et pos_boulet_y)
Principe de base
Lorsque le joueur presse la souris :
Le code de la fonction mousePressed() est appelé par Processing
La variable en_train_de_viser devient vraie
Lorsque le joueur bouge la souris avec le bouton pressé :
Le code de la fonction mouseDragged() est appelé par Processing
Une ligne de visée est affichée
Principe de base
Lorsque le joueur relache le bouton de la souris :
Le code de la fonction mouseReleased() est appelé par Processing
La variable tir_en_cours devient vraie et en_train_de_viser fausse
Les variables directionX,directionY,pos_boulet_x et pos_boulet_y sont calculées
Le tir est lancé
Principe de base
Il faut maintenant, dans la fonction draw(), mettre à jour la position du boulet en fonction de la direction (fonction avancerBoulet())
La fonction draw() est appellée en boucle et tant quel le jeu n'est pas fini :
Affiche le décor et le boulet si un tir est en cours
Appele la fonction qui met à jour la position du boulet si un tir est en cours et que suffisamment de temps s'est écoulé depuis la denière mise a jour
Teste si il y a une collision avec un joueur, le sol ou si le boulet est sorti du terrain, avec les fonctions correspondantes
Principe de base
Commencez par regarder en détail la fonction draw(), qui organise la boucle de jeu et fait appel aux différentes fonctions
Essayez d'identifier les différentes fonctions et leur objectif.
Les exercices suivants vous demanderons de modifier les fonctions appelées par draw() (et eventuellement la fonction draw() elle meme)
Rappels
Dans les exercices suivants, vous serez amenés à remplir et modifier des fonctions.
Pensez a lire attentivement le commentaire de la fonction qui explicite son but.
Identifiez les paramètres ainsi que le type de retour de la fonction
Chaque fonction doit remplir son rôle et uniquement son rôle.
Premiers essais
Vous pouvez remarquer que le jeu ne s'arrete jamais lorsque le boulet sort de l'ecran. Afin de corriger cela, il faut remplir la fonction bouletEstSorti
Cette fonction doit renvoyer vrai si un point de coordonnée x et y (passées en paramètre) est en dehors de la fenêtre.
De la même manière, seul le joueur 1 peut jouer pour l'instant. Examinez ce qui se passe lorsqu'on passe à un nouveau tour en regardant la fonction adéquate et corrigez le problème afin que le joueur 2 puisse lui aussi jouer a son tour.
Premiers essais
Nous pouvons maintenant alterner entre joueur 1 et joueur 2, mais notre boulet passe toujours à travers le terrain !
Profitons de l'occasion pour vérifier qu'il est possible de toucher le joueur adverse.
Essayez de toucher le joueur adverse et vérifiez qu'un message s'affiche dans la console. Corrigez au besoin le code (Rappel : les fonctions positionXDuJoueur(j) et positionYDuJoueur(j) vous renvoie les positions X et Y du joueur.)
Utilisez pour cela la fonction dist() qui renvoie la distance entre 2 points
Affichez également les points de vie de chaque joueur sur la console et verifiez que ceux ci sont modifiés lorsqu'un joueur est touché.
Interagir avec le terrain
Il va maintenant falloir interagir avec le terrain. Notre boulet passe pour l'instant au travers
Observez attentivement lee code et les conditions booleennes de la fonction draw() et corrigez le problème afin que le boulet s'arrete lors d'une collision avec le sol
Appelez maintenant la fonction creuserTerrain lors d'une collision avec le sol et observez le résultat (souvenons nous que seul le haut des montagne peut être touché)
Il faut utiliser la force...de gravité
Le trajet de notre boulet n'est pas très réaliste. Il va falloir ajouter un peu de gravité.
Dans la fonction avancerBoulet, modifiez la variable vitesse_boulet_y en lui ajoutant la variable gravité
Vous pouvez modifier les variables vitesse_max et gravité si vous le souhaitez
Un début de fin
Notre jeu ne s'arrete pas lorsque c'est la fin. Pouvez vous modifer la fonction fini() pour renvoyer vrai lorsqu'un joueur n'a plus de point de vie ?
Il est encore possible de viser lorsqu'un joueur ayant perdu presse la souris. Modifiez la condition booleenne de la fonction mousePressed() pour empecher cela.
Toujours Plus Loin
L'affichage sur la console est un peu triste :
Trouvez la fonction afficherVieDuJoueur et appelez la pour chaque joueur dans la fonction dessinerTout()
Remplissez cette fonction pour afficher en dessous du message un carré pour chaque point de vie du joueur j. Rappel : la position X du joueur j est disponible en appelant la fonction positionXDuJoueur(j)
Créez une fonction qui affiche le tour du joueur dans un message au centre de l'écran (vous pouvez pour cela utiliser la fonction text()) et appelez la dans la fonction dessinerTout()
Trichons un peu
Il est possible d'aider un joueur à viser en simulant le trajet du boulet. Créez pour cela une fonction d'aide à la visée. Cette fonction devra :
Créer de nouvelles variables pos_x,pos_y,vitesse_x,vitesse_y, qui prendront pour valeur pos_boulet_x,....,vitesse_boulet_y.
Dans une boucle, répéter X fois :
Avancer notre faux boulet (copiez le code de la fonction avancerBoulet() et utlisez le avec nos nouvelles variables)
Dessiner un cercle de taille 2 à la position pos_x, pos_y
Appelez votre fonction dans mouseDragged() et testez la.
D'autres éléments
Il est possible de continuer a rajouter des éléments tels que :
D'autres forces (vent, evenements aléatoires, courants d'air à un endroit du terrain...)
Plus d'interactions (Des boutons a cliquer pour demarrer, quitter, tricher un nombre limité de fois...)