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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé 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
    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 : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    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 éclairé 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
    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 confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    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 : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    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 éclairé 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
    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é)

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