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
} |
Partager