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 56 57 58 59 60 61 62 63 64
|
bool ControleurCollisions::TestPixelPerfect(Objet ^obj1, Objet ^obj2)
{
// on recupre les images des 2 objets
Bitmap^ image1 = ControleurAffichage::GetInstance()->recupererTexture(obj1->GetTexture());
Bitmap^ image2 = ControleurAffichage::GetInstance()->recupererTexture(obj2->GetTexture());
// on recupere le rectangle des 2 objets
Rectangle rect1 = Rectangle(obj1->GetPosition(), obj1->GetDimensions());
Rectangle rect2 = Rectangle(obj2->GetPosition(), obj2->GetDimensions());
// on recupere le rectangle de collision
Rectangle rectIntersect = rect1;
rectIntersect.Intersect(rect2);
// on recupere les pixel de chq image compris dans ce rectangle de collision
BitmapData^ pixelsImage1 = image1->LockBits(Rectangle(rectIntersect.X - obj1->GetPosition().X,
rectIntersect.Y - obj1->GetPosition().Y,
rectIntersect.Width, rectIntersect.Height),
ImageLockMode::ReadOnly, PixelFormat::Format32bppArgb);
BitmapData^ pixelsImage2 = image2->LockBits(Rectangle(rectIntersect.X - obj2->GetPosition().X,
rectIntersect.Y - obj2->GetPosition().Y,
rectIntersect.Width, rectIntersect.Height),
ImageLockMode::ReadOnly, PixelFormat::Format32bppArgb);
// nombre de colonne
int stride = pixelsImage1->Stride;
// on recupere un pointeur vers le debut des pixels
IntPtr ptr1 = pixelsImage1->Scan0;
IntPtr ptr2 = pixelsImage2->Scan0;
// nb pixels de l'image compris dans le rectangle (rgba)
int nbpixels = rectIntersect.Width * rectIntersect.Height * 4;
array<Byte>^ pixelsImg1 = gcnew array<Byte>(nbpixels);
array<Byte>^ pixelsImg2 = gcnew array<Byte>(nbpixels);
// copie les pixels qui sont dans le rectangle de collisions dans le tableau
System::Runtime::InteropServices::Marshal::Copy( ptr1, pixelsImg1, 0, nbpixels );
System::Runtime::InteropServices::Marshal::Copy( ptr2, pixelsImg2, 0, nbpixels );
// compare la composante alpha des pixels (composante : transparence)
for (int i = 3; i < pixelsImg1->Length; i+=4)
{
if (pixelsImg1[i] != 255 &&
pixelsImg2[i] != 255)
{
// on libere les pixels
image1->UnlockBits(pixelsImage1);
image2->UnlockBits(pixelsImage2);
return true;
}
}
// on libere les pixels
image1->UnlockBits(pixelsImage1);
image2->UnlockBits(pixelsImage2);
return false;
} |
Partager