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 :

Détection de collisions pixel perfect en 2D


Sujet :

Physique

  1. #21
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    CA Y EST !!!!!! CA MARCHE !!!! YES !! Mon pixel perfect marche super bien ^^ Trop content ^^ Merci à Laurent de m'avoir bien aider ^^

    http://rapidshare.de/files/24831834/Projet1.rar.html si c'est pas beau ça ^^.


    EDIT : par contre avec seulement 5 sprites (bon assez gros certes et j'ai fait en sortes qu'ils se cognent tout le temps), ben... ça rame ! Pour dans l'avenir (pas maintenant mais dans pour quelques mois), il y aurait une autre méthode plus rapide pour ça ? Et enfin Laurent, je ferai surement un jeu vers septembre avec une autre personne, mais j'ai juste une petite question à propos de l'organisation du jeu, je pourrais t'envoyer un petit MP (ce serait inutile de créer un topic pour ça).

  2. #22
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    dois je faire ca ? :

    1. Calculer le premier rectangle de collision
    2. Transformer pour chq objet ce rectangle en rectangle reel (avec leur rapport dimensionReelle/domensionEcran respectif)
    (rect0 = Rectangle(rect.Position(), rect.Taille() * rapport0) (pareil pour l'autre)
    3. Refaire un teste de collision des 2 rectangles reel pour avoir le vrai rectangle de collision(celui des texture)
    A froid là, oui ça y ressemble. Par contre le conseil que je peux te donner, c'est d'abstraire complétement cette gestion des tailles différentes (genre une fonction GetPixel(x, y) qui fait tous les calculs sales en interne), comme ça tu es sûr que ça ne vient pas empiéter sur ton algo de détection de collision ; et si un jour tu changes la gestion de tes textures tu n'as qu'une fonction à modifier plutôt que d'aller trifouiller partout dans le code.

    CA Y EST !!!!!! CA MARCHE !!!!


    Pour dans l'avenir (pas maintenant mais dans pour quelques mois), il y aurait une autre méthode plus rapide pour ça ?
    Je ne me suis jamais penché sur la question, mais on doit probablement pouvoir faire quelque chose

    Et enfin Laurent, je ferai surement un jeu vers septembre avec une autre personne, mais j'ai juste une petite question à propos de l'organisation du jeu, je pourrais t'envoyer un petit MP (ce serait inutile de créer un topic pour ça)
    Aucun problème, ou même un mail si tu veux.

  3. #23
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Ok je t'envoie un mail. Bon il me reste juste deux erreurs d'executions à régler et c'est bon. Par contre, ya un moment lorsque je fais le GetPixel, j'écris :

    HBITMAP hBitmap = pSprite->LireBitmap() pour récupérer le handle vers le bitmap, mais à la fin quand je veux le supprimer avec DeleteObject (hBitmap) et que je lance le programme, ben j'ai plus d'image. C'est normal, il ne faut donc pas le supprimer ?

  4. #24
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut
    bon je comprends pas

    Si je mets la meme taille à l'ecran que la taille reelle de l'objet : tout marche

    Ensuite j'ai essayé de changer la taille à l'ecran et là ca marche plus....

    voici ce que j'ai mis :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    bool OBJMOBILE::Collision(OBJET *pObj)
    {
    	RECTANGLE rectColl;
     
    	// S'il n'y a pas collision entre les deux rectangles à l'ecran, on quitte
    	if (!m_Rect.TesterIntersection(pObj->GetRect(), rectColl))
    		return false;
     
    	// il y a collision : on recupere le rectangle de collision des textures
    	// objet courant (this)
    	float fLImg = m_Texture->GetLargeur()/m_iNbImages;
    	float fHImg = m_Texture->GetHauteur()/m_iNbApparences ;
     
    	POINT rapportThis = POINT(fLImg / m_Rect.GetTaille().x, 
    				             fHImg / m_Rect.GetTaille().y);
     
    	RECTANGLE rectReelThis = RECTANGLE(rectColl.GetPosition(), 
    		                               rectColl.GetTaille()*rapportThis);
     
     
    	// l'autre objet (pObj)
    	fLImg = pObj->GetTexture()->GetLargeur()/pObj->GetNbImages();
    	fHImg = pObj->GetTexture()->GetHauteur()/pObj->GetNbApparences() ;
     
    	POINT rapportObj = POINT(fLImg / pObj->GetRect().GetTaille().x, 
    				            fHImg / pObj->GetRect().GetTaille().y);
     
    	RECTANGLE rectReelObj = RECTANGLE(rectColl.GetPosition(), 
    		                              rectColl.GetTaille()*rapportObj);
     
    	// rectangle de collision avec les dimensions reelles
    	RECTANGLE rectReel;
    	rectReelThis.TesterIntersection(rectReelObj, rectReel);
     
     
    	// calcule de la position relative du rectangle de collision de chq objet
    	POINT p0 = rectReel.GetPosition() - m_Rect.GetPosition();
    	POINT p1 = rectReel.GetPosition() - pObj->GetRect().GetPosition();
     
    	// comparaison pixel par pixel
    	for (int j=0; j<rectReel.GetTaille().y; j++)
    	{
    		for (int i=0; i<rectReel.GetTaille().x; i++)
    		{
    			// Si les 2 pixels sont à true, il y a collision
    			if (EtatPixel(p0.x + i, p0.y +j) && pObj->EtatPixel(p1.x + i, p1.y +j))
    			{
    				return true;
    			}
    		}
    	}
     
        return false
    }
    j'ai essayé d'aifficher mon rectangle de collision : comme je l'ai precisé : si c'est même dimension : OK sinon ca marche defois..... je comprends pas...

  5. #25
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Par contre, ya un moment lorsque je fais le GetPixel, j'écris :

    HBITMAP hBitmap = pSprite->LireBitmap() pour récupérer le handle vers le bitmap, mais à la fin quand je veux le supprimer avec DeleteObject (hBitmap) et que je lance le programme, ben j'ai plus d'image. C'est normal, il ne faut donc pas le supprimer ?
    Si tu le supprimes avant la fin de ton programme, effectivement il y a un problème

    j'ai essayé d'aifficher mon rectangle de collision : comme je l'ai precisé : si c'est même dimension : OK sinon ca marche defois..... je comprends pas...
    Attention à tes divisions. Si tu divises deux entiers tu auras un résultat entier, donc arrondi. Il faut caster l'une des deux opérandes en flottant pour avoir une division réelle.

  6. #26
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut
    exact pour les "castages" j'ai remedié à ce petit "oubli"

    Cependant le problème ne viens pas de là et ca fait 5h que je suis dessus.... j'en peux plus lol..

  7. #27
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Voilà c'est bon tout est reglé, en fait lors de la libération de la mémoire du vector, je dépassais les bornes d'1. Au fait, c'est la première fois que j'utilise un vector à double dimension, c'est bien comme ça qu'on le nettoie ?

    for (int x = 0 ; x < LireLargeur() ; x++)
    for (int y = 0 ; y < LireHauteur() ; y++)
    {
    m_bEtatsPixels [x].clear();
    }

    m_bEtatsPixels.clear();

    Et sinon tu as reçu mon mail ?

    CaptainChoc > Je peux pas t'aider mais bon courage quand même. Moi aussi j'ai passé des heures sur ce foutu pixel perfect, après quand tu réussis c'est d'autant plus plaisant ^^.

  8. #28
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut
    en fait je me demande : là je ne modifie que la taille de mon rectangle de collision.... (normal car entre l'ecran et le reel c'est pas la même) mais dois je aussi modifier la position de ce rectangle? et si oui comment? en le multipliant par quel rapport?

    De meme pour p0 et p1.... dois je les calculer avant ou apres la transformation............ pffff ca m'enerve je m'embrouille de partout lol

    merci de votre aide


    EDIT :
    ca sert a qqchose de redecter la collision avec les 2 rectangles reels ??
    (je parle tout seul mais comme ca je mets mes reflexions lol)



    En fait j'arrive à avoir les bonnes zones de mes textures.... pour chq objet, en fonction du rectangle de collision j'arrive à avoir la bonne partie correspondante à la partie réelle de la texture..... et maintenant ..... car du coup j'ai par exemple au debut j'obtient un rectangle de collision de 32x9. Pour chaque objet, je transforme ce rectangle en rectangle réel et j'obtient : un "rectangle de "50x12" et un autre de "200x30"...
    le voilà mon prob comment comparer ces 2 rectangles qui n'ont pas le même nbre de pixels.......

    Ou alors il faudrait pouvoir recuperer directement sur mon objet la texture "reduite".. mais là il faudrait a chq fois recalculer le masque... je donne pas chere des perfomance...



    Bon je ne trouve pas je pense que je vais mettre la même taille ca simplifiera tout... cependant si je veux mettre mon perso plus "grand" je devrait refaire un ensemble d'image plus grand?

Discussions similaires

  1. Théorie des collisions : collision au pixel près (pixel perfect)
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 7
    Dernier message: 19/12/2013, 11h16
  2. [moteur 2D][c++]Pixel perfect collision
    Par nikau6 dans le forum Développement 2D, 3D et Jeux
    Réponses: 7
    Dernier message: 19/02/2009, 15h48
  3. 2D - Pixel Perfect Collision
    Par Zacks dans le forum DirectX
    Réponses: 2
    Dernier message: 21/05/2006, 03h10
  4. [2D] Faiblesse de l'algo de collision pixel-perfect
    Par CPPTryer dans le forum Physique
    Réponses: 3
    Dernier message: 28/03/2006, 18h45

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