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 avons ajouté.
|
|
Selon la qualité 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 tomber. 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 lentement tomber 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 lui donner un poids de 0.
|
|
Et nous pouvons supprimer la partie du lecteur qui le fait tomber automatiquement, ainsi que 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: resolverCollision (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 le rappel love.keypressed (key) vers main.lua, et faisons-le appeler la fonction jump () du joueur, que nous allons faire 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 tombe lentement à mesure que la gravité continue d’augmenter.
Mais lorsque vous essayez, vous remarquerez que nous pouvons sauter plusieurs fois. Nous n’en voulons pas. Vous ne devriez pouvoir sauter que lorsque vous vous tenez au sol. Nous pouvons le faire en ajoutant une propriété canJump au lecteur. 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, cela devient faux.
|
|
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 collision (e) et définir canJump sur false lorsque la direction est en bas.
|
|
Et maintenant, nous ne pouvons sauter qu’une seule fois. Mais nous pouvons toujours sauter en l’air lorsque vous sortez d’une plate-forme et sautez.
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 l’êtes, cela signifie que vous n’êtes pas debout sur le sol.
|
|
Agréable! Il est très courant dans les plateformes que vous devez frapper quelque chose dans une certaine direction. Pensez à Mario par exemple. Vous obtenez seulement quelque chose du 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 le frappez par le bas, vous le sautez, mais le toucher par le haut vous fait 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 collision (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 parcourir la boîte.
Et si nous vérifions d’abord si les deux parties à la collision veulent que la collision soit résolue. Nous créons une fonction appelée checkResolved. 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 classique, la bibliothèque de classes que nous utilisons, chaque classe a la fonction: (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 baseclasses. Donc, si e devait être une boîte, e: is (Entity) retournerait vrai, car Box est une extension de l’entité de la classe de base.
Nous vérifions d’abord si nous entrons en collision avec une boîte, et si oui, nous vérifions si la direction est « en bas ». Si c’est le cas, retournez true (ce qui signifie que nous voulons résoudre la collision), sinon retournez 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, et à la fin de ce livre (pour l’instant!). 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 plus grand 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 le faire. Il en va de même pour la programmation. À votre santé !