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

DirectX Discussion :

2D - Pixel Perfect Collision


Sujet :

DirectX

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 34
    Points : 38
    Points
    38
    Par défaut 2D - Pixel Perfect Collision
    Bonjour,

    Je travaille actuellement sur un moteur 2D et j'ai quelques problèmes à créer un système de collisions pixel perfect. En effet, j'aimerais, lorsque j'initialise chaque sprite, créer une map, un tableau bidimensionnel contenant le masque de collision du sprite (alpha = 0 et autres = 1).

    Comment procéder avec directx pour récupérer tout ça ?


    Laurent Gomila :
    Je m'inspire beaucoup de tes sources et documents. Dans la source du jeu ZeGame, tu crées ta Collision Map comme ça :
    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
    
    ////////////////////////////////////////////////////////////
    // PRIVATE
    //
    // Construit la matrice de collision à partir du canal
    // alpha de la texture
    //
    ////////////////////////////////////////////////////////////
    void CTexture::BuildCollisionTable()
    {
    // Redimensionnement de la matrice de collision
    TBoolMatrix(m_iWidth, TBoolArray(m_iHeight, false)).swap(m_CollisionTable);
    // Verrouillage de la texture
    D3DLOCKED_RECT Rect;
    m_Texture->LockRect(0, &Rect, NULL, D3DLOCK_READONLY);
    unsignedlong* iPixels = reinterpret_cast<unsignedlong*>(Rect.pBits);
    unsignedint iPitch = Rect.Pitch >> 2;
    // Construction de la matrice à partir du canal alpha
    for (int i = 0; i < m_iWidth; ++i)
    for (int j = 0; j < m_iHeight; ++j)
    {
    m_CollisionTable[i][j] = ((Loulou::CColor(iPixels[i + j * iPitch])).GetAlpha() != 0x00);
    }
    // Déverrouillage de la texture
    m_Texture->UnlockRect(0);
    }
    
    Serait-il possible d'avoir le code de ta classe CColor ?

  2. #2
    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
    Héhé ces codes commencent à prendre de l'age...

    Voici l'implémentation de ma classe CColor, qui reste assez classique pour ce genre de choses.

    Si tu as d'autres questions n'hésite pas.
    Fichiers attachés Fichiers attachés

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 34
    Points : 38
    Points
    38
    Par défaut
    Wow, merci Loulou !
    Après deux trois modifications, tout marche très bien !

    Pour ceux qui débutent, comme moi :

    1) Texture non lockable si créée dans D3DPOOL_DEFAULT (donc Managé) et non plus avec D3DUSAGE_RENDERTARGET

    2) Possibilité de locker une région de la texture, en y indiquant un RECT (3ème paramètre de LockRect)

    Encore merci, ça m'aide beaucoup. Après pas mal de recherches sur la toile, il n'y avait pas une seule parcelle de code pour ça et directx.

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

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