Question

Quel est le meilleur moyen de détecter les collisions dans un sprite de jeu en 2D? Je travaille actuellement dans allegro et G ++

Était-ce utile?

La solution

Il existe une multitude de façons de détecter la détection de collision. Les méthodes que vous utilisez seront légèrement modifiées si vous utilisez un environnement 2D ou 3D. Rappelez-vous également, lors de la mise en place d'un système de détection de collision, de prendre en compte toute physique que vous souhaitez implémenter dans le jeu (nécessaire pour la plupart des jeux 3D de descente) afin d'en améliorer la réalité.

La version courte consiste à utiliser des cadres de sélection. Ou, en d'autres termes, créez une boîte pour chaque entité du monde, puis vérifiez si chacun des axes de la boîte est en collision avec d'autres entités.

Avec un grand nombre d’entités pour tester les collisions, vous pouvez vérifier dans un octree. Il vous suffirait de diviser le monde en secteurs, puis de ne rechercher que les objets se trouvant dans les mêmes secteurs.

Pour plus de ressources, vous pouvez aller sur sourceforge et rechercher le moteur de dynamique Bullet, qui est un moteur de détection de collision et de physique ouvert, ou vous pouvez consulter http://www.gamedev.net qui regorge de ressources sur de nombreux sujets relatifs au développement de jeux.

Autres conseils

Toute bibliothèque graphique 2D décente fournira ses propres fonctions de détection de collision pour tous les éléments, des images-objets alignées aux polygones en passant par les pixels, ou disposera d'une ou de plusieurs bonnes bibliothèques tierces pour exécuter ces fonctions. Votre choix de moteur / bibliothèque / infrastructure devrait dicter vos choix en matière de détection de collision, car ils sont probablement beaucoup plus optimisés que ce que vous pourriez produire seul.

Pour Allegro, il existe Collegro . Pour SDL, il existe SDL_Collide.h ou SDL-Collide . Vous pouvez utiliser I_COLLIDE avec OpenGL. DarkBASIC a un système de collision intégré et DarkPhysics pour des interactions très précises, y compris des collisions.

Pour utiliser une bibliothèque, je recommande Box2D

.

Cette question est assez générale. Il existe de nombreuses façons de détecter les collisions dans un jeu en 2D. Il serait utile de savoir ce que vous essayez de faire.

Comme point de départ, il existe des méthodes assez simples permettant la détection entre cercles, rectangles, etc. Je ne suis pas un grand fan de gamedev.net, mais il existe de bonnes ressources à propos de ce type de détection. ici est l'un de ces articles. Il contient des informations de base pouvant vous aider à démarrer.

Les jeux 2D de base peuvent utiliser des rectangles ou des cercles pour " entourer " un objet sur l'écran. La détection du moment où les rectangles se chevauchent ou lorsque les cercles se chevauchent est un calcul relativement simple. Si vous avez besoin de quelque chose de plus compliqué (tel que des polys d’artibrary convexes), la solution est plus compliquée. Encore une fois, gamedev.net pourrait être utile ici.

Mais vraiment pour répondre à votre question, nous devons savoir ce que vous essayez de faire? Quel type de jeu? Quel type d'objets essayez-vous d'entrer en collision? Essayez-vous d'entrer en collision avec les limites de l'écran, etc.

La mise en œuvre d'un système de détection de collision est une opération complexe, mais vous souhaitez prendre en compte trois points.

  • Monde d'objets. Partitionnement de l'espace. Si vous faites une vérification de collision contre chaque sprite 2D de votre monde contre tout le reste, vous aurez un programme lent et lent! Vous devez définir des priorités. Vous devez partitionner l'espace. Vous pouvez utiliser un système de grille orthogonal et découper votre monde en une grille 2D. Vous pouvez également utiliser un arbre BSP, en utilisant des lignes comme fonction de séparateur.

  • Détection de collision de phase large Ceci utilise des volumes englobants tels que des cylindres ou des élipses (celle qui correspond le mieux à la forme de vos sprites) pour déterminer si les objets valent la peine d'être comparés plus en détail. Le calcul pour cela est facile. Apprenez vos transformations de matrice 2D. Et pour l'intersection 2d, vous pouvez même utiliser des cartes vidéo très puissantes pour faire le gros du travail!

  • Détection de collision en phase étroite Maintenant que vous avez déterminé que deux objets ou plus valent la peine d'être comparés, vous passez à la section "Mise au point". Le but de cette phase est de déterminer le résultat de la collision. Profondeur de pénétration, volume compris, etc ... Et cette information sera transmise au moteur physique que vous avez planifié. En 3D, c’est le domaine des algorithmes de distance GJK et d’autres algorithmes neato que nous aimons tous tant!

Vous pouvez implémenter tout cela de manière générique et spécifier les résolutions larges et étroites de manière polymorphe, ou créer un point d'ancrage si vous travaillez dans un langage de niveau inférieur.

Des collisions entre quoi? Cela dépend si vous utilisez des sprites, des polygones concaves, des polygones convexes, des rectangles, des carrés, des cercles, des points ...

Vérifier la collision entre deux billes en 2D est facile. Vous pouvez le rechercher sur Google mais, fondamentalement, vous vérifiez si la longueur du rayon des deux balles combinées est supérieure ou égale à la distance entre le centre des deux balles.

Ensuite, vous pouvez trouver le point de collision en prenant le vecteur unitaire entre le centre des billes et en le multipliant par l’un des rayons de billes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top