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) "