Comment créer une détection de collision de jeu de rôle 2D réaliste?

9

J'ai toujours voulu créer un jeu de rôle 2D à l'ancienne comme Star Ocean, Final Fantasy, Sword of Mana et même la série «Tales of», et je suppose que beaucoup de gens le font. Mais avant même d'écrire une seule ligne de code, j'ai fait beaucoup de recherches, de dessins et d'essais.

J'ai trouvé presque toutes les réponses à mes questions, mais il y a un problème que je n'ai pas pu résoudre: comment créer une détection de collision réaliste mais simple , comme dans les jeux que j'ai nommés auparavant?

Je connais déjà plusieurs façons de calculer la détection de collision, regardez les exemples suivants:

Exemples de détection de collision

Aucun de ceux-ci ne satisfait mes besoins.

  • Les collisions à base de tuiles sont beaucoup trop simples et conviennent plus à un Zelda qu'à un Star Ocean. De plus, le dessin de chaque tuile doit remplir tout l'espace afin d'avoir l'air réaliste.
  • Pixel perfect a trop de contraintes. Si votre tuile a des pixels ici et là, le joueur sera probablement coincé au milieu de nulle part (c'est-à-dire: dans certains jeux, vous êtes coincé sur une racine d'arbre de 2 pixels de largeur).
  • Et les masques binaires utilisent trop de mémoire et de paramètres imo.

J'ai lu beaucoup de documentation mais je n'ai jamais trouvé quelque chose qui m'ait paru bien. Et tous mes essais ne ressemblaient pas à ce avec quoi je jouais. Donc, si vous avez de bons liens ou des didacticiels sur le fonctionnement du RPG 2D évolué, faites-le moi savoir.

Aymeric
la source
2
Quel environnement développez-vous pour que les masques de collision prennent trop de mémoire? Ce n'est vraiment pas une préoccupation pour la plupart des systèmes modernes, et les masques de collision ressemblent vraiment à ce que vous recherchez.
Gregory Avery-Weir
Je développe la plupart du temps sur PC avec XNA, mais récemment j'ai pensé à démarrer un projet sur WP7. Le problème que j'ai eu avec les masques de collision était que l'utilisation d'une petite résolution agissait exactement comme le ferait un pixel parfait, en faisant mon personnage coincé dans un coin par exemple. Donc, à moins que vous n'utilisiez la courbe de Bézier pour un mouvement fluide, vous devez faire très attention à la façon dont vous créez le masque.
Aymeric

Réponses:

9

Les N Tutoriels peuvent vous aider ici. Certes, ils sont pour un jeu de plateforme de style arcade, mais ils fonctionneront tout aussi bien pour un RPG vue de haut en bas; n'appliquez tout simplement pas la gravité. Le principe teste la collision dans une collection de formes de base - cercles, boîtes englobantes alignées sur l'axe, lignes, points, etc.

Vous pouvez ensuite en quelque sorte décorer votre monde avec ceux-ci (peut-être via un éditeur de niveau personnalisé), ou les générer automatiquement (s'adapter à une boîte ou un cercle le plus proche) - ou les deux (par défaut, la boîte / le cercle généré automatiquement et permettre à un concepteur de modifier) .

Là où je travaille, nous avons réalisé pas mal de plateformes et quelques jeux d'exploration descendants. Nous les faisons depuis les jours de l'ACS. Nous utilisons le plus souvent des AABB pour les personnages et les objets, réglables dans un éditeur de sprites - et nous devenons fous ici, permettant une tonne de boîtes par sprite, certaines avec des objectifs différents. Nous pourrions avoir:

  • une ou plusieurs boîtes de collision, décrivant la forme de l'objet pour rencontrer des objets;
  • peut-être de nombreuses "boîtes d'attaque" qui n'apparaissent que lorsque vous êtes au milieu d'une attaque (et animez avec le sprite), peut-être même deux ou trois par arme, selon;
  • quelques "boîtes vulnérables" qui subiront des dégâts lorsqu'elles seront touchées par les boîtes d'attaque des autres - par défaut, nous utilisons la boîte de collision, mais les boîtes vulnérables ont tendance à se sentir mieux lorsqu'elles sont plus petites que la boîte de collision, et nous pouvons autoriser pour les dommages liés à l'emplacement de cette façon
  • une ou plusieurs "boîte d'activation" sur l'IA qui décrivent la région de détection de l'IA - elles attaqueront si le joueur se trouve dans cette région, par exemple.

Les niveaux sont principalement des chaînes de segments de ligne; nous avons un peu de métadonnées par segment pour décrire les surfaces endommageantes ou glissantes, etc.

Ainsi, la plupart de la détection et de la réponse aux collisions devient AABB-vs-AABB ou AABB-vs-segment. Parfois, nous jetons un cercle contre quelque chose pour un projectile, bien que souvent un AABB fasse aussi bien ici.

Vous n'avez pas besoin de beaucoup de formes de base pour que les choses aient l'air bien et se comportent bien - quelques-unes suffiront, à condition que vous puissiez les modifier et les répéter.


Aussi, ne vous sentez pas mal à l'idée de mélanger les systèmes ensemble; les collisions basées sur les tuiles peuvent être excellentes dans certaines régions (représentant la majorité de votre monde) mais horribles pour les interactions objet-objet. C'est très bien; utilisez un système différent pour objet contre objet! Écrire pour les interactions entre les deux systèmes peut être plus facile que vous ne le pensez.

maigre
la source