Bonne physique des plateformes 2D [fermé]


76

J'ai un contrôleur de personnage de base configuré pour un jeu de plateforme 2D avec Box2D, et je commence à le peaufiner pour essayer de le rendre agréable. Les moteurs physiques ont beaucoup de commandes à modifier, et ce n'est pas clair pour moi d'écrire avec un moteur physique pour la première fois, lesquels sont ceux que je devrais utiliser. Le saut doit-il exercer une force sur plusieurs tiques? Une impulsion? Définir directement la vitesse? Comment puis-je empêcher l'avatar de coller aux murs sans lui enlever tout son frottement (ou est-ce que je supprime tout mon frottement, mais seulement dans les airs)? Devrais-je modéliser le personnage sous forme de capsule? Une boîte aux coins arrondis? Une boite à deux roues? Juste une grande roue? Je me sens comme si quelqu'un devait l'avoir fait avant!

Il semble y avoir très peu de ressources disponibles sur le Web qui ne soient pas la "première physique de bébé", qui sont toutes interrompues là où j'espère que quelqu'un a déjà résolu les problèmes. La plupart des exemples de moteurs physiques pour plateformes sont dotés de commandes flottantes, de sauts dans l'air ou d'un comportement facilement exploitable lorsque la pénétration temporaire est trop élevée, etc.

Quelques exemples de ce que je veux dire:

  • Un petit coup de saut saute une courte distance; un long coup saute plus haut.
  • Court dérapage lors de l’arrêt ou du retournement de direction à grande vitesse.
  • Debout de manière stable sur les pentes (mais peut-être en les glissant quand vous vous éloignez).
  • Vitesse analogique lors de l'utilisation d'un contrôleur analogique.
  • Toutes les autres choses qui séparent les bons joueurs de plate-forme des mauvais.
  • Oserais-je suggérer, des plates-formes mobiles stables?

Je ne cherche pas vraiment "hé, fais ça." De toute évidence, la bonne chose à faire dépend de ce que je veux dans le jeu. Mais j'espère que quelqu'un, quelque part, a passé en revue les possibilités et dit: "bien, la technique A présente bien X, la technique B fonctionne bien, mais cela ne fonctionne pas avec C", ou présente des exemples plus performants que "if (key = = espace) character.impulse (0, 1) "

Réponses:



25

Il est assez délicat d’appliquer, par exemple, une physique «semblable à celle de Mario» en utilisant un véritable moteur physique.

La dernière fois que j'ai essayé cela, en utilisant Chipmunk, j'ai modélisé le joueur en 2 cercles - un "cercle de corps" au-dessus d'un "cercle de pieds"

Le cercle de pieds avait des frictions, n'était pas gonflable et assez petit. Le «cercle de corps» était plus grand et sans frottement, pour éviter de coller aux murs / pentes abruptes

L'objet était contraint de ne pas autoriser la rotation - il ne ferait que glisser

Si les pieds touchent quelque chose ou se trouvaient dans les dernières images (pour permettre la chute de pentes), le joueur était considéré comme étant au sol (peut-être aussi eu-il un contrôle de surface normal)

Il y a longtemps que j'ai consulté le code, mais le comportement ressemblait à ceci:

Quand sur le terrain:

  • Appliquez une «gravité supplémentaire» (force vers le bas pour aider à dévaler les pentes)
  • Appliquez un frottement au sol (plus grande quantité d'amortissement horizontal)
  • Appliquez une force de mouvement gauche / droite en fonction des commandes.
  • (Réduisez la force de déplacement gauche / droite lorsque vous approchez d'une vitesse maximale)
  • Si vous appuyez sur Saut, appliquez une impulsion vers le haut.

Quand dans les airs:

  • Appliquer une résistance à l'air (petite quantité d'amortissement horizontal)
  • Appliquez une gravité régulière (ou réduite)
  • Appliquez une force de mouvement gauche / droite, si vous autorisez le contrôle dans l'air

Vous devez être prudent avec la commutation entre les deux états - rappelez-vous qu'en descendant une pente, vous pouvez quitter le sol pour quelques images - vous ne voulez probablement pas changer d'état / interdire les sauts à ce moment-là.

Quelques autres choses à surveiller, cependant… Les plates-formes «sautantes» peuvent être difficiles à mettre en œuvre, et lorsque vous commencez à faire des choses amusantes (plates-formes mobiles, mondes en rotation, etc.), vous devez faire attention à assurez-vous que le joueur ne peut pas être coincé / écrasé par un objet en mouvement "animé par l'animation".


Je sais que la réponse est assez ancienne, mais j'ai quelques questions à ce sujet. 1) Comment résolvez-vous la "garder la même vitesse quelle que soit la pente du terrain sur laquelle vous vous trouvez?" 2) Si vous utilisez un petit cercle pour les pieds et un cercle plus grand pour le corps, le joueur ne risque-t-il pas de se coincer sur les bords à quelques reprises? Je suis vraiment intéressé par votre approche.
Notbad

18

Honnêtement, je ne pense pas que l'utilisation d'un moteur physique soit la bonne approche pour un domaine de cette taille avec des exigences extrêmement strictes.

Il suffit d'écrire tout vous-même. Vous obtiendrez de bien meilleurs résultats en disant "déplacez le personnage de x unités dans cette forme de parabole lorsque vous maintenez le bouton de saut enfoncé pour la longueur y" plutôt que d'avoir plusieurs boutons à ajuster.


Je l'ai fait plusieurs fois dans le passé. Cela fonctionne à un point, mais vous finissez toujours par jeter quelque chose parce qu'il est "trop ​​difficile" de faire de la physique avec un contrôleur de hacky. Dans ce jeu en particulier, j'espère impliquer des mécanismes à ressort / corde pour le mouvement du joueur, et cela passe au domaine "je préférerais pirater un vrai moteur physique" plutôt que "je préférerais pirater une boîte déménageur".

3
Je préférerais pirater un déménageur, du moins, il ne peut pas être instable, alors qu'un moteur physique a tendance à exploser si vous lui appliquez trop de force, car vous devez contraindre les mouvements à des spécifications précises (et aux contraintes du moteur physique). t rigides, ils peuvent seulement essayer de se conformer autant). En outre, le recours à des forces pour résoudre un problème indésirable a tendance à influencer tout le reste, ce qui conduit à des tweakers.
Kaj

10

J'ai écrit une série d'articles sur la création d'un jeu de plateforme à partir de rien, à l'aide de technologies modernes, et expliquant comment j'ai géré la physique simple:

http://www.wildbunny.co.uk/blog/2011/12/14/how-to-make-a-2d-platform-game-part-2-collision-detection/

Cependant, si vous voulez quelque chose de plus high-tech, il est tout à fait possible de l'aborder en utilisant un moteur physique complet. Voici une technique que vous pouvez utiliser (de Little Big Planet) pour intégrer pleinement le personnage du moteur physique:

Au lieu d'appliquer des impulsions ou de définir des vitesses pour déplacer le joueur comme "entrées externes" dans le moteur physique, vous pouvez développer une contrainte qui contrôle le personnage.

Donc, cette contrainte aura la vitesse et la direction désirées du joueur comme entrée (du jeu) et modélisera des choses comme la force et la vitesse maximales du joueur. La contrainte essayera de déplacer le joueur en fonction de ses entrées (et obéissant aux maximums), et comme c'est une contrainte, elle appliquera une force égale et opposée sur l'objet sur lequel se trouve le joueur, permettant ainsi au joueur de se tenir sur des plateformes en mouvement. et pour affecter les choses qu'il déplace.

Faire des choses comme cela signifie que le joueur peut naturellement être capable de faire face à des situations telles que se trouver sous une énorme pile de boîtes ou sauter sur plusieurs plates-formes en mouvement, car il fait désormais partie intégrante du moteur physique.

J'espère que ça t'as aidé!

Salut, Paul.


6

Cette question a fait l’objet de discussions approfondies sur les forums Box2D. En lisant les discussions sur le mouvement du personnage, le saut ou le jeu de plateforme, vous rencontrerez tous les problèmes possibles. Cependant, le problème est devenu suffisamment compliqué pour que le système de filtrage des collisions soit mis à jour et qu'un exemple de banc d'essai soit créé uniquement pour montrer comment procéder.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.