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
| // Définition de la fonction TestCollision
bool Sprite::TestCollision (Sprite * pSprite)
{
// On récupère le rectangle de collision du deuxième sprite
RECT & rcCollisionFrappe = pSprite->LireRectCollision ();
// Si true, les rectangles de collision se chevauchent
if (m_rcCollision.left <= rcCollisionFrappe.right &&
rcCollisionFrappe.left <= m_rcCollision.right &&
m_rcCollision.top <= rcCollisionFrappe.bottom &&
rcCollisionFrappe.top <= m_rcCollision.bottom)
{
// True, donc on récupère le rectangle on s'est produit la collision
RECT rcCollision;
int iPointXA, iPointXB, iPointYA, iPointYB;
(m_rcCollision.left < rcCollisionFrappe.left ? rcCollision.left = rcCollisionFrappe.left,
iPointXA = rcCollision.left - m_rcCollision.left, iPointYA = rcCollision.top -
m_rcCollision.top, iPointXB = 0, iPointYB = rcCollision.top - rcCollisionFrappe.top :
rcCollision.left = m_rcCollision.left, iPointXA = 0, iPointYA = rcCollision.top -
m_rcCollision.top, iPointXB = rcCollision.left - rcCollisionFrappe.left,
iPointYB = rcCollision.top - rcCollisionFrappe.top);
(m_rcCollision.right < rcCollisionFrappe.right ? rcCollision.right = m_rcCollision.right :
rcCollision.right = rcCollisionFrappe.right);
(m_rcCollision.top < rcCollisionFrappe.top ? rcCollision.top = m_rcCollision.top :
rcCollision.top = rcCollisionFrappe.top);
(m_rcCollision.bottom < rcCollisionFrappe.bottom ? rcCollision.bottom = m_rcCollision.bottom :
rcCollision.bottom = rcCollisionFrappe.bottom);
vector < vector <bool> > bEtatsPixels = pSprite->LireEtatsPixels();
// On boucle dans le rectangle de collision. Si deux pixels visibles se chevauchent, alors
// il y a collision, sinon on retourne false
for (int x = rcCollision.left ; x <= rcCollision.right ; x++, iPointXA++, iPointXB++)
for (int y = rcCollision.top ; y <= rcCollision.bottom ; y++, iPointYA++, iPointYB++)
{
if ((m_bEtatsPixels [iPointXA][iPointYA] == true) &&
(bEtatsPixels [iPointXB][iPointYB] == true))
return true;
}
}
return false; // Pas de collision
} |
Partager