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

C++ Discussion :

Gérer le déplacement de personnages en 2D (et collisions)


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 79
    Points : 49
    Points
    49
    Par défaut Gérer le déplacement de personnages en 2D (et collisions)
    Bonjour,
    Dans le cadre d'un projet (un bomberman) je dois poser différents objets mobiles. Hors pour les représenter sur la carte j'ai un doute sur la méthode: utiliser une matrice, au début je pensé à l'employer avec un enum pour les valeurs des cases, choses très problématique. Mais je me demande si l'idée de stocker les différentes adresse des différents objet touchant la case. Ou sinon j'ai eu aussi l'idée (bien que je sais quelle ne soit pas envisageable) de faire une liste avec les différents objets, mais ça m'obligeré à tester la liste entière pour voir si il y a collision à chaque tour de boucle.

    Quelqu'un aurait une bonne idée à me proposer?
    Merci d'avance et bonne journée

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2011
    Messages : 54
    Points : 67
    Points
    67
    Par défaut
    Bonjour,

    Il doit certainement y avoir pas mal de façon de gérer ce genre de choses. Représenter ton tableau de jeu sous forme de matrice est une bonne base, ça te permettra par exemple de gérer n'importe quelle taille de tableau, contrairement à l'enum où tout sera figé. Ensuite, pour les collisions, tout dépend de tes besoins. Partons du principe où tu veux savoir quels objets collisionnent entre eux, et pas simplement détecter une collision. Il te faut donc connaitre, pour chaque case, quels sont les objets présents dessus. A priori il ne peut y en avoir qu'un seul, donc tu peux te contenter de stocker, pour chaque case, un pointeur sur l'objet présent. Lorsqu'un objet veut se déplacer, il teste la case destination sur la présence d'un autre objet.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 79
    Points : 49
    Points
    49
    Par défaut
    merci pour ta réponse, mais justement il peut y avoir plusieurs objet sur la même case, car par exemple la taille de la box des objets est inférieure à celle de la case, stocker plusieurs pointeur serait une solution correcte? je ne vois pas trop de meilleure solution

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2011
    Messages : 54
    Points : 67
    Points
    67
    Par défaut
    Oui, tu peux stocker une liste de pointeur. Il faut bien se rendre compte qu'à un moment donné, dans la gestion de collision, tu seras certainement amené à parcourir des listes d'objets pour tester les collisions. Ensuite, il existe des techniques, comme par exemple subdiviser l'espace, pour optimiser les tests.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    D’après moi le plus simple dans ton cas est d'avoir une liste contenant tout tes objets en jeu sans tenir compte de leurs position.
    Tu te sert de cette liste non seulement pour les collision mais aussi pour l'affichage. A moins d'avoir des centaines d'objets c'est simple et pas lourd

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 79
    Points : 49
    Points
    49
    Par défaut
    @vravier: merci pour ta réponse je crois que je vais mi mettre de ce pas ^^

    @bebahji: oui c'est la méthode bête et méchante à laquelle j'ai pensée au début, mais bon je n'aime pas l'idée de faire des calculs inutiles, parce que faire des tests pour les collisions avec chaque objet sur chaque autre objet, et cela à chaque tour de boucle, par contre l'affichage c'est plus aisé c'est pour ca que j'aurais également une liste (comme dans mon projet d'origine) sauf si je trouve mieux

    et bien donc merci à tous ^^
    sur ce je vais bosser un peu

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Si le test de collision se fait sur une hitbox unique sur chaque objet, même avec un algo naïf en O(n) ce n'est pas trop lourd (à moins, comme le dit bebaijhi, d'avoir vraiment beaucoup d'objets).

    Par contre, si tu veux un test de collision au pixel près, il convient de ne tester que les objets qui ont une chance d'être en collision (ce que je ferais en faisant d'abord un test de hitbox unique).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de déplacement du personnage sur Pygame
    Par Youpat97 dans le forum Programmation multimédia/Jeux
    Réponses: 7
    Dernier message: 08/05/2013, 02h04
  2. Problème de déplacement du personnage sur Pygame
    Par Youpat97 dans le forum Général Python
    Réponses: 15
    Dernier message: 24/04/2013, 00h42
  3. Gérer le déplacement des ennemis
    Par dré kam dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 25/03/2012, 21h58
  4. Gérer le déplacement de zones nommées
    Par doublenico dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 11/01/2008, 12h05
  5. Déplacement de personnage coérent
    Par poussinphp dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 25/04/2007, 15h48

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