L'objectif de ce deuxième cours est d'aborder les principaux problèmes liés à un jeu de plateforme et voir comment structurer le code, notamment pour gérer les différents types de déplacements et les collisions.
Pour suivre correctement ce cours, il est conseillé d'ouvrir en parallèle les sources, dont l'archive est téléchargeable ci-dessous.
Dans un jeu 2D à base sprites, ce qui inclut les jeux de plateformes, les deux principaux challenges techniques concernent la détection des collisions et la gestion des mouvements. Ils sont d'ailleurs liés car quand on se déplace, on est amené à entrer en collision, à tomber, ...
La première chose à faire pour relever ces challenges est de bien définir le comportement des sprites et dans quels cas, on estime qu'il y a collision, que le sprite tombe, qu'il peut bouger librement, etc. Malheureusement, même avec une étape de conception poussée à ce sujet, on tombe souvent lors des tests sur des cas particuliers qui vont par exemple bloquer complètement le sprite, le faire traverser des obstacles, le déplacer de façon irrationnelle, etc. En effet, le résultat observable dépend beaucoup de la façon dont les collisions sont réellement calculées. Parfois, cette façon de calculer amène à des situations "exotiques" qui n'ont pas été prévues lors de la conception. Dans ce cas, il faut soit changer la façon de calculer (= bof), soit se débrouiller pour ne jamais tomber sur ces cas exotiques (= mieux). Et pour cela, c'est plutôt l'expérience dans la structuration du code qui permet de résoudre les comportements anormaux.
L'objectif des sections suivantes est de proposer une solution "générique" à ces challenges dans un cas assez précis, mais pas totalement basique :
Le fait que les plateformes soient horizontales peut sembler une contrainte très forte. Cependant, le fait qu'un sprite puisse "remonter" une pente inférieure à une certaine inclinaison (descendre est facile) constitue un des challenges de déplacement les plus complexes à résoudre. Il sera juste survolé dans la dernière section bonus et abordé de façon plus complète dans l'article suivant : TD n°3 : un jeu de plateformes - version avancée.
Ces différents comportements sont tous initiés par des interactions du joueur, en l'occurrence en appuyant sur des touches du clavier. La première question à se poser est donc comment gérer correctement le clavier.
Pour déplacer un sprite, on suppose que le joueur peut appuyer sur :
De plus, le sprite ne bouge de façon continue que si l'on maintient une touche flèche enfoncée. Autrement dit, dès qu'il n'y a plus de touche enfoncée, le sprite s'arrête. Cette dernière contrainte impose une solution unique pour gérer les touches :