Bonjours,
Voila, j'ai fais une fonction permettant la détection de collision au pixel prés, et j'aimerai savoir si ce serai possible de l'optimiser afin de la rendre plus rapide.
Je crée d'abord, pour chaque sprite, un tableau indiquant quels sont les pixels transparents.
ensuite la fonction qui détecte les collisions:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 bool** mT; mT = new bool*[mWidth]; for(int i=0;i<mWidth;i++) mT[i] = new bool[mHeight]; for(int i=0;i<mWidth;i++) for(int j=0;j<mHeight;j++) { if(GetPixel(mBitmap->GetMemHdc(), i, j) == RGB(255, 0, 255)) mT[i][j] = false; else mT[i][j] = true; }
Merci d'avance pour vos réponses
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
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 inline bool cSprite::PixelCollision(cSprite* sprite) { if(mVisible) { // Detection par rectangle de collision RECT& rect1 = sprite->GetCollisionRect(); if(mCollisionRect.left <= rect1.right && rect1.left <= mCollisionRect.right && mCollisionRect.top <= rect1.bottom && rect1.top <= mCollisionRect.bottom) { RECT rect2; if(mCollisionRect.left>=rect1.left) rect2.left = mCollisionRect.left; else rect2.left = rect1.left; if(mCollisionRect.top>=rect1.top) rect2.top = mCollisionRect.top; else rect2.top = rect1.top; if(mCollisionRect.right>=rect1.right) rect2.right = rect1.right; else rect2.right = mCollisionRect.right; if(mCollisionRect.bottom>=rect1.bottom) rect2.bottom = rect1.bottom; else rect2.bottom = mCollisionRect.bottom; // Largeur et hauteur du rectangle de collision int width = (rect2.right - rect2.left); int height = (rect2.bottom - rect2.top); //Calcul du decalage sur les deux sprites int x1 = (rect2.left - mCollisionRect.left); int y1 = (rect2.top - mCollisionRect.top); int x2 = (rect2.left - rect1.left); int y2 = (rect2.top - rect1.top); for(int i=0;i<width;i++) { for(int j=0;j<height;j++) { if((mT[i+x1][j+y1] == true) && (sprite->mT[i+x2][j+y2] == true)) return true; } } return false; } } return false; }![]()
Partager