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 :

[moteur 2D][c++]Pixel perfect collision


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre extrêmement actif Avatar de nikau6
    Homme Profil pro
    Inscrit en
    Février 2008
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Février 2008
    Messages : 406
    Points : 739
    Points
    739
    Par défaut [moteur 2D][c++]Pixel perfect collision
    Bonjours,

    Voila, j'ai fais une fonction permettant la détection de collision au pixel prés, et j'aimerai savoir si ce serai possible de l'optimiser afin de la rendre plus rapide.

    Je crée d'abord, pour chaque sprite, un tableau indiquant quels sont les pixels transparents.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    bool** mT;
    mT = new bool*[mWidth];
            for(int i=0;i<mWidth;i++)
    			mT[i] = new bool[mHeight];
     
            for(int i=0;i<mWidth;i++)
    	        for(int j=0;j<mHeight;j++)
    	        {
    		        if(GetPixel(mBitmap->GetMemHdc(), i, j) == RGB(255, 0, 255))
    					mT[i][j] = false;
    				else
    					mT[i][j] = true;   
    			}
    ensuite la fonction qui détecte les collisions:


    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
    inline bool cSprite::PixelCollision(cSprite* sprite)
    {
    	if(mVisible)
    	{
                    // Detection par rectangle de collision
    		RECT& rect1 = sprite->GetCollisionRect();
    		if(mCollisionRect.left <= rect1.right && rect1.left <= mCollisionRect.right &&
    	       mCollisionRect.top <= rect1.bottom && rect1.top <= mCollisionRect.bottom)
    		{
    			RECT rect2;
    			if(mCollisionRect.left>=rect1.left)
    				rect2.left = mCollisionRect.left;
    			else
    				rect2.left = rect1.left;
    			if(mCollisionRect.top>=rect1.top)
    				rect2.top = mCollisionRect.top;
    			else
    				rect2.top = rect1.top;
    			if(mCollisionRect.right>=rect1.right)
    				rect2.right = rect1.right;
    			else
    				rect2.right = mCollisionRect.right;
    			if(mCollisionRect.bottom>=rect1.bottom)
    				rect2.bottom = rect1.bottom;
    			else
    				rect2.bottom = mCollisionRect.bottom;
     
                // Largeur et hauteur du rectangle de collision
    			int width = (rect2.right - rect2.left);
    			int height = (rect2.bottom - rect2.top);
     
    			//Calcul du decalage sur les deux sprites
    			int x1 = (rect2.left - mCollisionRect.left);
    			int y1 = (rect2.top - mCollisionRect.top);
    			int x2 = (rect2.left - rect1.left);
    			int y2 = (rect2.top - rect1.top);
     
     
     
    			for(int i=0;i<width;i++)
    			{
    				for(int j=0;j<height;j++)
    				{
    					if((mT[i+x1][j+y1] == true) && (sprite->mT[i+x2][j+y2] == true))
    						return true;
    				}
    			}
    			return false;
    		}
    	}
    	return false;
    }
    Merci d'avance pour vos réponses

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 386
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 386
    Points : 20 476
    Points
    20 476
    Par défaut
    Salut je vois que tu utilises des API du GDI.
    GetPixel n'est pas rapide et encore moins SetPixel il vaut mieux utiliser GetDIBBits() et SetDIBbits() et créer des bitmaps en mémoire..
    Sinon as-tu vraiment besoin du GDI ?
    Avec SDL,SFML ou Direct X ce sera plus performant...
    L'inconvénient c'est que si tu appelles l'accélération graphique tu ne peux pas afficher des "common controls" facilement..

  3. #3
    Membre extrêmement actif Avatar de nikau6
    Homme Profil pro
    Inscrit en
    Février 2008
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Février 2008
    Messages : 406
    Points : 739
    Points
    739
    Par défaut
    Salut,
    En fait, je fabrique un moteur de jeux 2D rien qu'avec L'API Win32.Je sais que ce ne sera pas le plus performant des moteur de jeux, mais je me suis dis que ça pouvait être un bon moyen d'apprendre et ensuite de passer à DirectX, OpenGL...Et puis ça me permet d'apprendre la programmation Windows, ce qui peut-être utile par la suite avec DirectX et OpenGL.

    Je vais me renseigner pour l'utilisation de GetDIBBits() et SetDIBBits();

    Merci

  4. #4
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 386
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 386
    Points : 20 476
    Points
    20 476
    Par défaut
    Salut nikau6 tu as raison c'est une bonne démarche
    Citation Envoyé par nikau6 Voir le message
    Salut,
    Je sais que ce ne sera pas le plus performant des moteur de jeux
    Eh pas forcément bien utilisé le GDI peut suffire souvent c'est même plus performant que SDL.
    C'est certain que si tu veux aficher des objets 3d avec l'accélération 3d des cartes graphiques le GDI ne sera pas adapté..
    Mais pour des jeux en 2d avec des animations simples cela peut suffire la plupart du temps.
    Pour maitriser le GDI et les API il faut consulter le MSDN souvent

  5. #5
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 528
    Points : 5 198
    Points
    5 198
    Par défaut
    je ne pense pas que ce soit une bonne idée de bidouiller le GDI et le Win32 aujourd'hui
    sauf erreur de ma part, ces API sont dépréciées sous Vista et amenées à disparaitre avec les futures versions de windows
    si c'est pour faire du windows, se mettre à directx serait plus intéressant

  6. #6
    Membre extrêmement actif Avatar de nikau6
    Homme Profil pro
    Inscrit en
    Février 2008
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Février 2008
    Messages : 406
    Points : 739
    Points
    739
    Par défaut
    Bon, de toute facon je vais le finir mon moteur, il est déja bien avencé.Un point incontéstablement positif de ma démarche à mon sens est que maintenant DirectX(j'ai lu des trucs)me semble plus évidant.Avant de me mettre à win32, je me souviens avoir trouvé DirectX éffrayant et lui avoir préferé OpenGL.Mais plus maintenant.Win32 et DirectX ont des similitude(même si Win32 est du c et DirectX du C++), et je me crois prêt à m'y mettre.
    Qu'est ce qui va remplacer Win32 pour utiliser avec DirectX?Do net?Ou alors microsoft prépare autre chose?

    Merci pour tes encouragements Math.M.

  7. #7
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Il y aurait bien la possibilité d'utiliser des masques de 32 ou 64 bits. Plutôt que d'utiliser des booléens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    false, false, false, true, true, true, [...]
    On aurait un bit par pixel, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    00011111 11111111 11111111 11111111, 11100011  11111111  11111111  10000000
    Ça permet, en jouant avec des décalages et les opérateurs logiques, de tester beaucoup de pixels à la fois. Par contre, aucune idée de ce qu'il y a à gagner en termes de performances.

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 386
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 386
    Points : 20 476
    Points
    20 476
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    je ne pense pas que ce soit une bonne idée de bidouiller le GDI et le Win32 aujourd'hui
    sauf erreur de ma part, ces API sont dépréciées sous Vista et amenées à disparaitre avec les futures versions de windows
    si c'est pour faire du windows, se mettre à directx serait plus intéressant
    Pas du tout bien au contraire.
    Dans Visual Studio 2010 les MFC seront améliorées et encore plus développées.
    Sans compter le développement parallèle avec Visual C++.
    Je ne vois pas en quoi Ms va abandonner win32 c'est impossible techniquement !
    Les API win32 et le GDI ce sont des couches systèmes
    Microsoft ne va pas redévelopper tout un OS ça risque de lui couter cher surtout que l'éditeur a supprimé déjà 1500 postes me semble-t-il..
    Regarder ce sujet
    http://www.developpez.net/forums/d65...-win64-dotnet/

    Citation Envoyé par nikau6 Voir le message
    :Merci pour tes encouragements Math.M.
    Eh bien avec plaisir ; faut pas se laisser influencer : si tu te sens performant avec win32/gdi alors continues dans cette voie-là le principal c'est un résultat final et faire des jeux pas des querelles de clochers sur les technologies à choisir

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. Détection de collisions pixel perfect en 2D
    Par Bakura dans le forum Physique
    Réponses: 27
    Dernier message: 04/07/2006, 13h59
  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