Chute
Maintenant que nous pouvons résoudre la collision, nous pouvons créer un jeu de plateforme. Un jeu où vous tombez et pouvez sauter. Créons d’abord une carte pour nous promener. Nous pouvons supprimer le seul mur que nous avions ajouté.
|
|
Selon la puissance de votre ordinateur, vous remarquerez peut-être que le jeu est devenu très lent. En effet, tous les murs que nous avons ajoutés vérifient les collisions entre eux. C’est très inefficace, car il n’est pas nécessaire de vérifier cela. Les murs ne bougent jamais, ils ne se chevaucheront donc jamais. Au lieu de cela, nous devons créer une table séparée pour tous les murs. La table des objets vérifie la collision avec elle-même et la table des murs, mais la table des murs ne vérifie pas la collision avec elle-même.
|
|
D’accord, maintenant nous pouvons commencer à ajouter de la physique de plateforme. Commençons par faire tomber le joueur. Dans player.lua, nous faisons déjà descendre le joueur lorsque nous appuyons sur la touche bas. En supprimant cette instruction if, le joueur tombera automatiquement.
|
|
Cela fonctionne, l’objet tombe, mais ce n’est pas ainsi que fonctionne la gravité. Un objet devrait tomber lentement et, à mesure qu’il tombe, il devrait gagner en vitesse. Créons quelque chose qui ressemble plus à de la gravité réelle dans la classe Entity. Nous avons besoin d’une propriété de gravité et de poids. Nous utilisons la propriété de gravité pour augmenter la position y de l’entité, et nous utilisons la propriété de poids pour augmenter la gravité. Nous augmentons donc la vitesse à laquelle nous chutons.
|
|
Comme les murs n’ont pas besoin de tomber, nous pouvons leur donner un poids de 0.
|
|
Et nous pouvons supprimer la partie du code du joueur qui le fait tomber automatiquement, ainsi que celle qui le fait remonter en appuyant sur la touche Haut.
|
|
Mais lorsque vous exécutez le jeu assez longtemps, vous remarquerez peut-être que le joueur et la boîte tombent à travers le sol. En effet, la gravité continue d’augmenter même s’ils sont debout sur le sol. Nous devons réinitialiser la gravité lorsqu’ils se tiennent sur le sol. Nous pouvons le faire dans Entity:resolveCollision(e).
|
|
Et maintenant, ils ne tombent plus à travers le mur.
Sauter
Il est maintenant temps de rendre le joueur capable de sauter. Nous le faisons sauter lorsque la touche haut est enfoncée. Commençons donc par ajouter le rappel love.keypressed(key) dans main.lua, et faisons-le appeler la fonction jump() du joueur, que nous allons créer dans un instant.
|
|
Alors, que doit-il se passer pour faire sauter le joueur ? C’est en fait très simple. Nous donnons simplement à la gravité une valeur négative. Plus la valeur est basse (ou en d’autres termes, plus la valeur est négative), plus le joueur saute haut.
|
|
Au fur et à mesure que la gravité du joueur change, il saute dans les airs et retombe lentement à mesure que la gravité continue d’augmenter.
Mais lorsque vous essayez, vous remarquerez que nous pouvons sauter plusieurs fois. Nous ne voulons pas cela. Vous ne devriez pouvoir sauter que lorsque vous vous tenez au sol. Nous pouvons le faire en ajoutant une propriété canJump au joueur. Lorsque vous atterrissez au sol, la propriété devient vraie et lorsque vous sautez, ce que vous ne pouvez faire que lorsque canJump est vrai, elle devient fausse.
|
|
Mais pour le moment, si nous voulons effectuer une action à l’atterrissage, dans ce cas définir canJump sur true, nous devons le faire dans la classe Entity. Ajoutons une fonction qui est appelée lors de la résolution d’une collision, afin de pouvoir remplacer ces fonctions dans la classe Player.
|
|
Et maintenant, nous pouvons remplacer la fonction collide(e) et définir canJump sur true lorsque la direction est “bottom”.
|
|
Et maintenant, nous ne pouvons sauter qu’une seule fois. Mais nous pouvons toujours sauter en l’air lorsque nous sortons d’une plateforme et sautons.
Nous pouvons résoudre ce problème en vérifiant si la position y précédente n’est pas égale à la position y actuelle. Lorsque vous vous tenez au sol, vous ne devez pas vous déplacer verticalement. Donc, si vous le faites, cela signifie que vous n’êtes pas debout sur le sol.
|
|
Super ! Il est très courant dans les jeux de plateforme que vous deviez frapper quelque chose dans une certaine direction. Pensez à Mario par exemple. Vous obtenez seulement quelque chose du bloc avec un point d’interrogation lorsque vous le frappez par le bas, et vous ne pouvez tuer un ennemi qu’en sautant dessus. Un exemple plus avancé est peut-être les plateformes sur lesquelles vous pouvez sauter. Lorsque vous les frappez par le bas, vous les traversez, mais les toucher par le haut vous permet de vous tenir dessus.
Essayons de créer une telle plateforme.
Plateformeur
Nous allons utiliser notre boîte pour cela. Nous voulons faire en sorte que le joueur ne pousse pas la boîte mais au contraire la traverse. Quand il saute sur la boîte, il se tient au-dessus. Pour que cela se produise, nous devons à nouveau apporter des modifications. La fonction collide(e, direction) correspond à ce qui devrait se produire lorsque la collision est résolue. Mais nous ne voulons pas que la collision soit résolue. Nous voulons pouvoir traverser la boîte.
Et si nous vérifions d’abord si les deux parties à la collision veulent que celle-ci soit résolue ? Nous créons une fonction appelée checkResolve. Si self et e renvoient vrai, alors nous continuons à résoudre la collision.
|
|
Maintenant, dans player.lua, nous pouvons remplacer la fonction checkResolve(e, direction). Avec la bibliothèque de classes classic que nous utilisons, chaque classe a la fonction :is(classe) qui peut être utilisée pour vérifier si une instance d’une classe appartient à un certain type de classe. Nous pouvons donc utiliser e:is(Box) pour vérifier si e est du type Box. Cela fonctionne également avec les classes de base. Donc, si e est une boîte, e:is(Entity) retournerait vrai, car Box est une extension de la classe de base Entity.
Nous vérifions d’abord si nous entrons en collision avec une boîte, et si oui, nous vérifions si la direction est “bottom”. Si c’est le cas, nous retournons true (ce qui signifie que nous voulons résoudre la collision), sinon nous retournons false.
|
|
Résumé
En augmentant la valeur que nous utilisons pour augmenter notre position y, nous pouvons simuler la gravité. Nous pouvons sauter en réglant la gravité sur une valeur négative. En ajoutant des fonctions et en remplaçant ces fonctions, nous pouvons appliquer des actions lors d’une collision, ou empêcher une collision de se produire.
La fin ?
Et avec cela, nous sommes à la fin de ce chapitre. J’espère que vous avez apprécié la lecture de tous les chapitres et bien sûr beaucoup appris en les lisant. J’ai encore des plans pour de nouveaux chapitres, mais c’est pour une autre fois. D’ici là, je vous souhaite bonne chance dans votre cheminement pour devenir un programmeur de jeux encore meilleur que vous ne l’êtes déjà. Comme je l’ai dit dans l’introduction, vous pouvez lire sur la peinture tout ce que vous voulez, mais pour l’apprendre, vous devez la pratiquer. Il en va de même pour la programmation. À votre santé !