Comment gérer la détection de collision afin que les objets rapides ne puissent pas traverser les murs?

14

Je crée un jeu de tir à défilement horizontal 2D et j'ai un peu de mal avec la détection de collision pour les balles. Tout, y compris les puces, sont des objets avec leurs propres polygones / méthodes de mise à jour.

Le problème est que les balles vont vite, et à 60 images par seconde (ce à quoi le jeu se déroule), une balle sautera souvent à travers un mur - car elle se déplace plus que la largeur du mur pendant l'intervalle de mise à jour - et continuer joyeusement sur son chemin puisque les polygones ne se chevaucheront jamais réellement.

Que puis-je faire à ce sujet? La seule chose que j'ai pu trouver est de tracer une ligne de l'ancienne position à la nouvelle position et de faire une détection de collision là-dessus, mais le dessin de ligne pour la détection de collision est recommandé par la documentation de slick2d. Comment puis-je résoudre ça?

Mala
la source
Pas une réponse complète, donc un commentaire. Je ne recommanderais jamais de dessiner graphiquement une ligne mais mathématiquement vous pouvez le faire, c'est juste une simple intersection plan-rayon pour voir si la collision s'est produite. Vous pouvez ensuite effectuer une détection de pas fixe plus petite pour obtenir le moment exact (et toutes les informations qui l'accompagnent) lorsque la collision s'est produite sans avoir à fonctionner à un rythme constamment plus élevé, comme suggéré dans les réponses. Faites une vérification moins coûteuse, puis passez le temps à obtenir une réponse aussi précise que vous le souhaitez.
James

Réponses:

9

Les approches standard sont (en choisir une):

  1. Augmentez votre largeur de limite ET / OU réduisez la vitesse maximale de votre balle afin qu'elle ne puisse jamais sauter à travers un mur en une seule mise à jour (nécessite un peu de Pythagore pour déterminer les distances maximales / les largeurs minimales des limites);
  2. Effectuez une détection de collision continue (CCD), généralement par diffusion de rayons pour détecter une collision avec des surfaces linéaires (2) ou planes (3D) devant l'objet en mouvement. C'est plus cher, mais c'est une solution plus complète. La diffusion de rayons sur des lignes 2D est assez basique, mais vous devez définir toutes vos limites en tant que polygones à bord droit dans ce cas.

Pour cette question, vous pouvez plutôt modéliser vos balles sous forme de rayons - si cela correspond à l'apparence de votre jeu, comme dans left4kdead . De cette façon, vous n'avez pas besoin d'approximer les balles sous forme de rayons, car ce sont déjà des rayons. Du point de vue de l'apparence, cela peut sembler décent si vous tracez la ligne avec un point plus clair à l'extrémité de la balle, ou dessinez simplement la ligne en dégradé de la lumière (extrémité de la balle) à l'obscurité (extrémité de la queue), ce qui lui donne une apparence de mouvement.

Je conviens que dans la plupart des cas, l'utilisation de graphiques pour la détection de collision est un peu malavisée, mais la détection de collision au pixel près est exactement cela, et est une technique acceptée. Je suppose que tout dépend de ce que vous voulez réaliser et de la rapidité. Si vous n'avez pas besoin d'un jeu très rapide avec de nombreux corps + action, allez-y. Sinon, il vaut mieux utiliser l'une des approches décrites ci-dessus.

Ingénieur
la source
Merci pour la bonne réponse - idéalement, j'aimerais qu'il soit rapide avec de nombreux corps en mouvement. La raison pour laquelle je traite les balles comme des objets physiques est qu'elles sont affectées par la gravité comme tout le reste (donc légèrement en arc, en fonction de la vitesse de la balle, etc.). N'est-ce pas une bonne façon de procéder? Ceci est mon premier jeu, donc je cherche toujours les meilleures pratiques. Je pourrais également utiliser une équation parabolique, mais je ne sais pas comment j'aurais configuré les coefficients relatifs à l'angle vitesse / visée de la balle
Mala
3
Cela ressemble à trop de détails pour les balles. Dans la vraie vie, lorsque vous tirez une balle, il est peu probable que vous trouviez cette limace en raison de la force du ricochet, de l'imprévisibilité de l'angle de richochet, etc. Ou bien, elle entre simplement dans un corps et y reste (arbre, personne). Je les ferais simplement disparaître ou ricocher puis disparaître peu de temps après. Concentrez-vous sur votre gameplay de base, ne vous inquiétez pas trop de ces petits détails. Le réalisme est mieux concentré sur les choses qui comptent.
Ingénieur
Ouais, je suppose que je peux simplement utiliser des lignes droites pour les balles et peut-être trouver un moyen de les faire courber vers le bas un peu plus tard, si cela semble important.
Mala
2
Si la vitesse des balles n'est pas trop élevée (c'est-à-dire pas si rapide que vous ne pourriez pas les voir voyager à travers l'écran), vous pouvez simplement appliquer la gravité à leur vitesse tout en modélisant leur détection de collision à l'aide de rayons simples. L'utilisateur ne remarquera pas plus que la balle se déplace comme une série de lignes droites qu'il ne remarquera comment tous vos autres objets font également la même chose. Pour les traces de balles, calculer et dessiner une trace courbe (spline) n'est pas difficile et augmentera l'illusion d'une courbe lisse sur la trajectoire de la balle.
Sean Middleditch
3

Si vous voulez que vos balles se comportent comme des objets physiques réalistes (par exemple, vos balles ressemblent plus à des flèches ou à des pierres d'une catapulte qu'à des tirs d'armes à feu), vous pouvez également essayer d'augmenter la fréquence de vos mises à jour physiques.

Ainsi, bien que votre jeu puisse fonctionner avec 60 images par seconde, votre simulation physique pourrait s'exécuter à 120 mises à jour par seconde (voici le correctif omniprésent de votre article d' horodatage qui explique une bonne configuration physique qui peut fonctionner à une vitesse différente de la boucle de rendu).

Bien sûr, l'augmentation de l'intervalle de mise à jour sur le moteur physique mettra une charge plus importante sur le processeur. Cette approche n'est donc sensée que si vos projectiles ne se déplacent pas très rapidement (ce que je supposais puisque vous êtes en mesure de dire que vos projectiles se déplacent en arc).

bummzack
la source
Merci! Je fais cela efficacement (tout en utilisant des projectiles en forme de ligne) et j'espère que cela restera possible à mesure que le jeu se complique
Mala