IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Collisions entre ennemis jeu 2D


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 16
    Par défaut Collisions entre ennemis jeu 2D
    Bonjour à tous,

    J'essaie de créer un jeu de 2D en c avec la bibliothèque SDL.
    Et le problème est que je souhaite à présent gérer les collisions entre ennemis dans mon jeu (pour les interdire d'être les uns sur les autres).
    Sachant que les propriétés de mes ennemis sont stockés dans un tableau, j'ai pensé à la procédure suivante :

    -Afin de déplacer un ennemi, à chaque pas du déplacement en cours, parcourir le tableau d'ennemis et pour chacun des autres ennemis vérifier qu'il n'est pas en collision avec l'ennemi que l'on est en train de déplacer.

    -Pour déplacer l'ensemble des ennemis, répéter cette procédure pour chacun des ennemis.

    Le problème est que cette technique me parait trop lourde et couteuse en ressources mais que je ne vois pas comment faire autrement.
    J'aurais donc souhaité avoir des suggestions.

    Merci par avance.

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Pour limiter le nombre de tests à faire, on peut quadriller l'espace de jeu.

    Chaque ennemi se trouve alors dans une case du quadrillage (il peut y avoir plusieurs ennemi dans une meme case). On peut alors limiter les tests aux ennemi présents dans la meme case, ou dans les 8 cases voisines.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 528
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 528
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Pour limiter le nombre de tests à faire, on peut quadriller l'espace de jeu.

    Chaque ennemi se trouve alors dans une case du quadrillage (il peut y avoir plusieurs ennemi dans une meme case). On peut alors limiter les tests aux ennemi présents dans la meme case, ou dans les 8 cases voisines.
    salut mais le problème restera le même non ?
    Parce que pour diviser l'espace du jeu on va devoir boucler sur toute la liste des personnages joueurs et non joueurs ?
    Sinon on m'a parlé d'utiliser des quadtrees comment mettre cela en oeuvre ?
    Merci pour les réponses

  4. #4
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Parce que pour diviser l'espace du jeu on va devoir boucler sur toute la liste des personnages joueurs et non joueurs ?
    Cela il faudra de toutes façons le faire mais le quadrillage vise à remplacer cette boucle par une boucle très simple.
    On peut en effet considérer la case à laquelle appartient l'objet comme une de ses données membres constamment mise à jour lors des déplacements.
    De sorte que pour détecter les collisions on peut éliminer d'entrée les couples d'objets appartenant à des cases trop éloignées pour se concentrer sur ceux pour lesquels une collision est a priori possible.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  5. #5
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 528
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 528
    Par défaut
    ok merci pour la réponse il faut que je cogite dessus....

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par mach1 Voir le message
    -Afin de déplacer un ennemi, à chaque pas du déplacement en cours, parcourir le tableau d'ennemis et pour chacun des autres ennemis vérifier qu'il n'est pas en collision avec l'ennemi que l'on est en train de déplacer.

    -Pour déplacer l'ensemble des ennemis, répéter cette procédure pour chacun des ennemis.

    Le problème est que cette technique me parait trop lourde et couteuse en ressources mais que je ne vois pas comment faire autrement.
    Tu peux optimiser sensiblement la chose à peu de frais en triant les positions de tes personnages dans une liste chaînée et en maintenant cette liste triée. L'avantage de la liste chaînée est de rendre faciles les insertions.

    Ainsi, les personnages en collision sont forcément consécutifs dans ta liste. Si deux personnages ne coïncident pas, alors tu sais que les suivants ne le feront pas non plus.

  7. #7
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Tu peux optimiser sensiblement la chose à peu de frais en triant les positions de tes personnages dans une liste chaînée et en maintenant cette liste triée.
    Une position dans le plan= un couple de valeurs (x,y). Trier suppose un ordre. Je ne connais aucun ordre canonique sur R^2.
    J'appuie par contre fortement la proposition de pseudocode.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par Zavonen Voir le message
    Une position dans le plan= un couple de valeurs (x,y). Trier suppose un ordre. Je ne connais aucun ordre canonique sur R^2.
    J'appuie par contre fortement la proposition de pseudocode.
    Pas trop fort quand même, elle n'est pas bien solide.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par Zavonen Voir le message
    Une position dans le plan= un couple de valeurs (x,y). Trier suppose un ordre. Je ne connais aucun ordre canonique sur R^2.
    Je sais : c'est volontairement simplifié. C'est tout-à-fait adapté si la position dans le plan des personnages suit un chemin, par exemple, et sinon, rien n'empêche de maintenir deux listes en parallèle, l'une pour x, l'autre pour y, et ne retenir que les éléments qui sont consécutifs dans les deux listes.

    À dire vrai, je pense que ce ne serait pas plus coûteux que la solution de pseudocode car, dans ce cas, il faut quand même passer en revue tous les personnages pour savoir s'ils se trouvent dans une case pour, ensuite, examiner de plus près les colocataires et vérifier s'ils rentrent effectivement en collision.

    Je pense qu'au final, la complexité n'est pas beaucoup meilleure que comparer directement leur positions, sauf à numéroter toutes les cases et à classer les personnages dans une liste triée par numéro de case pour retrouver directement les co-occupants, auquel cas on se ramène exactement à ma suggestion initiale : une liste triée sur un ensemble ordonné à une dimension.

  10. #10
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    À dire vrai, je pense que ce ne serait pas plus coûteux que la solution de pseudocode car, dans ce cas, il faut quand même passer en revue tous les personnages pour savoir s'ils se trouvent dans une case pour, ensuite, examiner de plus près les colocataires et vérifier s'ils rentrent effectivement en collision.
    Généralement on a une liaison bidirectionnelle entre les personnages et la "Tile Map". On n'a donc pas besoin de passer tous les personnages en revue.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 16
    Par défaut
    Tout d'abord, merci aux personnes qui ont pris sur leur temps précieux pour me répondre.

    D'après ce que j'ai pu lire je pense qu'il peut être une bonne idée de faire un quadrillage de mon niveau comme il me l'a été conseillé.

    Pour l'implémentation, je pense créer un tableau à 2 dimensions dont chaque case contiendrait une liste des ennemis qui touchent la zone indexée par la case.
    Pour chaque déplacement d'ennemi je mettrais à jour les listes.

    Au final, lorsque je déplacerais un ennemi je n'aurais donc qu'à vérifier s'il est en collision avec les ennemis présents dans les zones du quadrillage que l'ennemi à déplacer touche.

    Ainsi, j'aimerais savoir si cette idée vous parait valide,
    et si elle l'est, si le fait d'ordonner les listes pouvait être utile ou non.

Discussions similaires

  1. Détection de collisions entre rectangles
    Par davcha dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 13/04/2006, 18h26
  2. Détection de collision entre un cube et un carré
    Par Mat 74 dans le forum Physique
    Réponses: 15
    Dernier message: 17/03/2006, 14h01
  3. GLScene et les collisions entre les objets
    Par HopeLeaves dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 13/06/2005, 19h45
  4. Réponses: 4
    Dernier message: 25/09/2004, 09h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo