Je développe un petit moteur de jeu 2D. Les personnages ont une méthode de peinture qui fait actuellement ce qui suit:
- Calculez la nouvelle position du personnage en fonction de sa vitesse, etc.
- Mettre à jour la cellule de la grille de collision **
- Dessinez le personnage à la nouvelle position
** J'ai créé une grille de collision pour réduire le nombre de contrôles d'intersection
Maintenant, l'algorithme de base que j'ai pensé pour détecter la collision est:
For Each Character
Check intersection with characters in surrounding 8 cells
Je peux simplement placer ce code dans la méthode de peinture. Mais voici le problème que j'anticipe.
Supposons que deux caractères A et B se trouvent dans des cellules adjacentes de la grille de collision. Maintenant, selon l'algorithme ci-dessus dans l'itération du caractère A, il détectera qu'il est entré en collision avec B. Dans l'itération pour le caractère B, il détectera qu'il est entré en collision avec A.
Mais j'ai une idée que lorsque A détecte qu'il est entré en collision avec B, il doit informer B qu'il est entré en collision avec A. Cela permettrait d'économiser beaucoup de comparaisons lorsqu'il y a plus de 2 acteurs en collision. Mais je ne sais pas comment gérer cela. Je pense qu'au lieu que chaque personnage vérifie sa collision, je devrais vérifier la collision à l'intérieur de la boucle de jeu.
Cette approche serait-elle correcte? Comment avez-vous géré ce genre de problème? J'ai pensé au truc de la grille de collision moi-même. Existe-t-il des alternatives à la logique de grille de collision?
la source
Réponses:
L'approche habituelle pour la détection des collisions consiste à ne pas détecter les collisions A ou B par elles-mêmes.
Au lieu de cela, vous déplacez d'abord tous les objets, puis un système de collision distinct recherche les collisions entre toutes les paires d'objets, informe chaque objet des choses avec lesquelles il est entré en collision, puis rend enfin tous les objets.
Donc, essentiellement, au lieu de "déplacer, vérifier les collisions, dessiner" à l'intérieur de votre fonction Paint (), vous divisez "déplacer" et "dessiner" en fonctions distinctes que vous appelez séparément (d'abord "déplacer" pour chaque objet, puis "dessiner" pour chaque objet). Et entre ceux-ci, vérifiez les collisions.
Remarque avancée: si l'un de vos objets se déplace en réaction aux collisions détectées, vous devrez peut-être répéter l'étape "Rechercher les collisions entre toutes les paires d'objets", au cas où la réponse à la collision d'un objet provoque une autre collision.
la source
Je lance une boucle pour tous mes personnages dans la boucle de jeu comme vous le dites.
La façon dont je le fais est avec un état sur chacun de mes personnages, donc si A et B entrent en collision pendant que A vérifie la collision, A et B sont définis pour frapper. au début de la boucle de B, il vérifie s'il est déjà atteint, si tel n'est pas le cas, id ne lance pas la boucle.
J'ai mis le code affect dans la boucle afin que toute action à entreprendre sur B se soit produite dans la boucle de A, donc il ne devrait pas y avoir de raison pour que B vérifie car cela gâcherait le résultat de la collision, cela peut être différent pour vous cependant .
la source