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 ?