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

Développement 2D, 3D et Jeux Discussion :

collision - plusieurs entités


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre habitué Avatar de poussinphp
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 428
    Points : 176
    Points
    176
    Par défaut collision - plusieurs entités
    Bonsoir !

    J'ai une class "sprite" qui contient a une fonction qui test si le sprites est en collision avec la case d'un tableau de sprite d'une class "carte".

    J'ai hérité la class "sprite" en 2 class distinctes (personnage / monstre). Héritant de la class sprites, la gestion des collision avec la carte ce fais correctement.

    Malheureusement, les collisions entre entités monstre-monstre joueur-monstre ne sont pas géré. J'ai cherché une solution pour résoudre ce problème mais comment peut t'on detecter que la position d'un sprite d'une autre instance de la meme class ou d'une autre class est sur la case d'a coté (dans le but de gerer les collisions) ?

    J'ai 3 monstres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	Cmonstre *monstre1 = new Cmonstre("Ressources/monstre.gif",1,1,120,250);
    	Cmonstre *monstre2 = new Cmonstre("Ressources/monstre.gif",1,1,140,250);
    	Cmonstre *monstre3 = new Cmonstre("Ressources/monstre.gif",1,1,160,250);
    Leur déplacement est aléatoire (encore médiocre mais je suis à la recherche d'un bon algo ), la gestion des collisions avec la carte est niquel, mais la collisions entre-eux n'est pas géré

  2. #2
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    il existe plein de possibilité, en fonction de comment est conçu ton jeu.
    si ta carte est une grosse matrice de cases, tu peut simplifier la gestion des collisions en mettant dans chaque cases si elle est traversable ou pas (quand une entité change de case, il suffit de passer l'ancienne a passable et la nouvelle à pas passable).

    si ta carte n'est pas une matrice, tu peut très bien faire heriter tes entitées d'une classe Collidable qui va definir ce qu'il faut pour effectuer les collisions entre deux entitées, et ensuite, tu fait un singleton de collisionManager qui va stocker tout tes collidable et a chaque tour de boucle de jeu, il test les collisions et repositionne les entitées.

    l'aventage de la première methode est qu'elle est extremement simple et robuste, par contre elle ne s'applique qu'au jeu basé sur des cases. La seconde est plus générique mais plus complexe et couteuse en temps de calculs (O(n²) car il faut tester chaque unités avec toutes les autres, mais tu peut mettre en place des algo de partitionnement pour reduire ca).
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  3. #3
    Membre habitué Avatar de poussinphp
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 428
    Points : 176
    Points
    176
    Par défaut
    Concernant la gestion des collisions entre les entités et le terrains, j'ai dans mon fichier carte un bool pour chaque case définissant s'il est passable ou non. J'en obtient un tableau de booleans lors du chargement de la carte. Me suffis de tester chaque entités avec la carte (envoyé en paramètre) avant d'appliquer un deplacement.(Ce qui me reviens à 1 test par déplacement et par entité).

    En faite, une case à une taille fixe et une carte est un sorte de matrice graphique avec une matrice de boolean.

    Par contre, pour les entités, la taille peut être variable et le déplacement s'effectue en pixel et non en case (Je pense donc déclarer des points de test sur chaque entités).

    Mon principal problème réside dans le faite que je n'arrive pas à tester si les entités X et Y sont en collisions. Chaque entités est dessiné à la main dans la boucle principale du main. J'ai essayé de crée un tableau d'entités mais ce n'est pas possible en c++ à partir du moment ou le constructeur comporte des arguements et je ne vois pas trop comment relier mes entités pour pouvoir faire des tests entre-eux

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Regarde un peu comment j'ai géré les collisions ici :

    http://fearyourself.developpez.com/t...ns-ameliorees/

    Cela te donnera des idées.

    Jc

  5. #5
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    si tu a des entitée de tailles variables, tu peut très bien utiliser la seconde technique avec une simple collision cylindrique à partir du rayon. et tu peut très bien stocker des pointeurs vers tes entités dans un vecteur, ce qui te resoud ton problème de constructeur
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  6. #6
    Membre habitué Avatar de poussinphp
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 428
    Points : 176
    Points
    176
    Par défaut
    J'ai beau avoir regardé le tuto, je comprend pas l'utilité d'un vecteur dans mon cas...(les monstres ce deplacent aléatoirement et peuvent changer de direction à tout moment sans qu'il n'y ai eu aucune collision) J'ai idée d'utiliser une liste doublement chainé de class monstres mais ça prendrais pas en compte l'utilisateur et pour les collisions faudrais parcourir de gauche à droite sans arret (ce qui me semble très peu optimisé)

  7. #7
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par poussinphp
    J'ai beau avoir regardé le tuto, je comprend pas l'utilité d'un vecteur dans mon cas...(les monstres ce deplacent aléatoirement et peuvent changer de direction à tout moment sans qu'il n'y ai eu aucune collision) J'ai idée d'utiliser une liste doublement chainé de class monstres mais ça prendrais pas en compte l'utilisateur et pour les collisions faudrais parcourir de gauche à droite sans arret (ce qui me semble très peu optimisé)
    Un vecteur sert pour avoir un pointeur sur les objets, rien à voir avec comment bougent les éléments dans le vecteur.

    Ensuite, on utilise le simple algorithme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    - Pour chaque élément dans le vecteur :
       Bouge l'élément
       Tester la collision avec les autres éléments
       Si collision
          Remettre élément à position d'origine
          Mettre à jour la vitesse et direction
       Fsi
    Jc

  8. #8
    Membre habitué Avatar de poussinphp
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 428
    Points : 176
    Points
    176
    Par défaut
    Génial ça ! Je pensais au mot vecteur : Définition en mathématique et donc que le déplacement des monstres devais être prévu... mais là j'ai compris

    Par contre j'ai des monstre "Class Cmonstre" et un personnage "Class Cpersonnage" et peut être aussi des pnj "class Cpnj".... on peut tous les integrer dans le vecteur ou ce n'est pas possible? (dans le tutorial, il me semble qu'il n'y ai qu'un seul type d'objet )

    En tout cas merci pour cet éclaircissement

  9. #9
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par poussinphp
    Par contre j'ai des monstre "Class Cmonstre" et un personnage "Class Cpersonnage" et peut être aussi des pnj "class Cpnj".... on peut tous les integrer dans le vecteur ou ce n'est pas possible?
    Il faudra utiliser l'héritage pour ca...

    Jc

  10. #10
    Membre habitué Avatar de poussinphp
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 428
    Points : 176
    Points
    176
    Par défaut
    l'héritage...

    Alors là, ça ce corse je pense
    Mes class Cmonstre, Cpnj, Cmarchand, Cjoueur hérite de la class Csprite. Faudrais que je fasse une class entité par dessus?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
                  |-[Cjoueur]----|
    [Csprite]--|                   |-[Centite] 
                  |_[Cmonstre]--|
     
    class Cvecteur {
    public:
       Cvecteur();
       ~Cvecteur();
       void add_entite(o *typesprite);
    private:
       Centite *entite;
    };
     
    void Cvecteur::add_entite(o *typesprite)
    {
      this->entite = new[Centite];
    }
    Voila comment je conçoit assez grossièrement comment faire mais il me reste encore un soucis. Je ne peut pas créer de tableau de Centite car son constructeur contiendras des paramètres...

    Je me sens coincé là

  11. #11
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Dépendant de ce que tu veux faire, tu mets une classe abstraite au-dessus de Csprite ou en dessous (donc avant la spécialisation).

    Cette classe demandera d'implémenter les fonctions qui donneront la position, la taille et toutes les autres infos pour savoir s'il y a une collision.

    Jc

  12. #12
    Membre habitué Avatar de poussinphp
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 428
    Points : 176
    Points
    176
    Par défaut
    Je pense avoir pas mal d'erreur. Je vais modifier ainsi :

    La class sprite contiendras un element de la class image.
    La class monstre contiendras un element d'image et ne seras pas hérité de sprite car un monstre c'est pas un sprite.
    // joueur //. Elle contiendras aussi un element de la class inventaire.
    // pnj //.
    // marchand //. Elle contiendras aussi un element de la class inventaire.

    Une class niveau(vecteur) contiendras un element carte, un tableau dynamique de sprite, // de monstre, // de pnj, // de marchands, un element de joueur.

    C'est la class niveau qui devras contenir les monstres, pnj, marchands et joueur gérereras la gestion des collisions entre eux.

    Qu'en pensez vous? C'est mieux comme organisation pour gerer les collisions, non?

  13. #13
    Membre habitué Avatar de poussinphp
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 428
    Points : 176
    Points
    176
    Par défaut
    Finalement j'ai revu mon code, j'héritais mes monstres et mon perso de sprite alors qu'il fallais que j'utilise une class image depuis chaqu'une d'elle.

    Du coup je passe en 2 passes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	int w = 50;
    	Cmonstre *monstre = new Cmonstre[w];
    	for (int z = 0; z < w; z++)
    	{
    	monstre[z].init("Ressources/monstre.gif",1,1,120,250);
    	}
    et là, surprise ! j'ai bien 50 monstres en même temps qui se déplacent indépendament. Côté mémoire, 3mo (avec le perso + la carte).

    Voici la documentation de mon programme actuel :Lien

    C'est à partir de la que je sais plut trop comment gerer mon moteur. Dois-je fais une class qui utilise un entité Ccarte, Cpersonnage, tableau dynamique de Cmonstre...?

    Merci d'avance pour vos conseil (qui m'ont deja permis la création de plusieurs monstres en tableau )

    Voici aussi un screen du jeu

  14. #14
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    Personnellement, je ferait une hierarchie de classes dans le genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    GraphicEntity (utilise une Image)
     +CollisionEntity (gere les collisions)
     | + Monstre
     | + Joueur
     | + decor
    bon après, c'est juste un exemple en suivant ton diagramme de classes
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

Discussions similaires

  1. [MCD] relations partagées entre plusieurs entitées
    Par Kynet dans le forum Schéma
    Réponses: 5
    Dernier message: 11/02/2011, 00h57
  2. [MLD] Relier des modes de communication à plusieurs entités
    Par khyor dans le forum Schéma
    Réponses: 4
    Dernier message: 05/05/2010, 16h50
  3. editer plusieurs entitées dans un seul formulaire.
    Par lepirlouit dans le forum Struts 1
    Réponses: 1
    Dernier message: 01/04/2010, 11h18
  4. [JPQL] Iterator sur plusieurs entités
    Par longbeach dans le forum JPA
    Réponses: 2
    Dernier message: 05/11/2008, 14h11
  5. Plusieurs entités pour une même relation
    Par Mandotnet dans le forum Schéma
    Réponses: 1
    Dernier message: 08/04/2007, 19h13

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