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

Physique Discussion :

[2D] Algorithme de collision


Sujet :

Physique

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Points : 189
    Points
    189
    Par défaut [2D] Algorithme de collision
    bonjour,

    j'essaie de faire un algorithme de collision entre sprite (entre rectangle)

    le probleme n'est pas la rencontre, mais ou se situe la rencontre entre les deux sprites.

    je m'explique; comment savoir si le sprite A est sur le Sprite B dans le coin haut gauche. par exemple.

    c'est comme un mario like , comment savoir que mario arrive par dessus l'ennemi et pas de face.

    je ne sais pas si je suis assez clair???


    pour l'instant, le plus simple que j'ai touvé, c'est des codes pour chaque situations,.

    j'ai aussi pensé a quand l'engine tombe sur une rencontre, il dit simplement au deux sprite il y a une rencontre avec l'autre. et c'est les sprites qui s'arrange pour savoir ou cela se site..


    QUelle est la meilleur decision???


    merci


    a++

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    tu fais une fonction collisionEntreDeuxRectangles, et tu retournes 0 si il n'y a aucune collision, 1 si y'a une collision par le haut, 2 si il y a une collision par la gauche, 4 si il y a une collision par le bas, 8 si il y a une collision par la droite. (le tout relativement au premier rectangle fourni)
    Si il y a une collision sur un coin tu combines les deux côtés avec le ou binaire.

    Pour simplifier tu pourras définir des constantes.
    Boost ftw

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 35
    Points : 33
    Points
    33
    Par défaut
    Je pense que c'est mieux en effet de faire une recherche de collision générale, et une fois la collision détectée, suivant les coordonnées des sprites précédant l'instant de la rencontre, tu codes les comportements pour chaque cas.
    C'est comme ça que je ferais.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Points : 1 156
    Points
    1 156
    Par défaut
    Non en fait il existe des algorithmes de collisions de type PixelPerfect

  5. #5
    mat.M
    Invité(e)
    Par défaut
    En plus de la méthode de détection de pixel donnée précedemment , une autre méthode serait de prendre le centre de Mario qui représente la longueur d'image de Mario /2 , de prendre cette même mesure de l'autre personnage et de calculer la distance entre les 2; si cette distance est inférieure à un certain seuil alors collision....

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Points : 1 156
    Points
    1 156
    Par défaut
    La méthode du cercle englobant ;-) ca peut marcher en effet.

  7. #7
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Points : 189
    Points
    189
    Par défaut
    merci, j'ai trouv mon bonheur.


    a++

  8. #8
    Membre confirmé Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Points : 552
    Points
    552
    Par défaut
    J'aimerai poursuivre ce topic car j'ai essayé de faire une fonction de test de collision qui retourne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	public final static int _NO_COLLISION = 0;
    	public final static int _COLLISION_TOP_LEFT = 1;
    	public final static int _COLLISION_TOP = 2;
    	public final static int _COLLISION_TOP_RIGHT = 3;
    	public final static int _COLLISION_LEFT = 4;
    	public final static int _COLLISION_CENTER = 5;
    	public final static int _COLLISION_RIGHT = 6;
    	public final static int _COLLISION_BOTTOM_LEFT = 7;
    	public final static int _COLLISION_BOTTOM = 8;
    	public final static int _COLLISION_BOTTOM_RIGHT = 9;
    	public final static int _COLLISION_OVERLAY = 10;
    Et ma fonction qui détermine chaque cas est une succession de tests avec des "et" et "ou". Je ne trouve pas ça joli. Existe t il un moyen simple pour y arriver?

    Classe sprite
    *********

    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
    	public int collidesWith(Sprite sprite) {
    		if (this == sprite)
    			return _NO_COLLISION;
     
    		Rectangle r1 = this.getCurrentFrame().getZoneCollision();
     
    		Rectangle r2 = sprite.getCurrentFrame().getZoneCollision();
     
    		Rectangle r3 = r1.intersection(r2);
     
    		if (r3.isEmpty())
    			return _NO_COLLISION;
     
    		... // c'est ici tous mes cas de tests que je souhaite simplifier
     
    		return _NO_COLLISION;
    	}

    Merci pour le coup de main!

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

Discussions similaires

  1. algorithme de collision 3D
    Par chetropinchuste dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 14/02/2010, 13h16
  2. Algorithme de gestion des collisions
    Par Christuff dans le forum Physique
    Réponses: 4
    Dernier message: 11/07/2009, 10h50
  3. L'algorithme AABB (pour les détecteurs de collision)
    Par Fandekasp dans le forum Mathématiques
    Réponses: 2
    Dernier message: 20/08/2007, 09h51
  4. Réponses: 1
    Dernier message: 07/03/2007, 09h28
  5. Algorithme de collisions
    Par TabrisLeFol dans le forum Physique
    Réponses: 7
    Dernier message: 23/02/2006, 15h52

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