|
bool CDemoGame::isCollision(CSprite* pSprite1,CSprite* pSprite2)
{
if (!pSprite1->CollideWith((*pSprite2)))
{
return false;
}
int intersectLeft = pSprite1->GetSpriteRect()->left > pSprite2->GetSpriteRect()->left ? pSprite1->GetSpriteRect()->left : pSprite2->GetSpriteRect()->left;
int intersectTop = pSprite1->GetSpriteRect()->top > pSprite2->GetSpriteRect()->top ? pSprite1->GetSpriteRect()->top : pSprite2->GetSpriteRect()->top ;
int intersectRight = pSprite1->GetSpriteRect()->right < pSprite2->GetSpriteRect()->right ? pSprite1->GetSpriteRect()->right : pSprite2->GetSpriteRect()->right ;
int intersectBottom = pSprite1->GetSpriteRect()->bottom < pSprite2->GetSpriteRect()->bottom ? pSprite1->GetSpriteRect()->bottom : pSprite2->GetSpriteRect()->bottom ;
int intersectWidth = intersectRight - intersectLeft;
int intersectHeight = intersectBottom - intersectTop;
int thisImageXOffset = intersectLeft - pSprite1->GetSpriteRect()->left;
int thisImageYOffset = intersectTop - pSprite1->GetSpriteRect()->top;
int otherImageXOffset = intersectLeft - pSprite2->GetSpriteRect()->left;
int otherImageYOffset = intersectTop - pSprite2->GetSpriteRect()->top;
LPDIRECT3DTEXTURE9 pTexture1;
LPDIRECT3DTEXTURE9 pTexture2;
pTexture1 = (LPDIRECT3DTEXTURE9)(pResManager->GetResource(RES_TEX,pSprite1->GetResName()))->dwHandle;
pTexture2 = (LPDIRECT3DTEXTURE9)(pResManager->GetResource(RES_TEX,pSprite2->GetResName()))->dwHandle;
bool isCollison = DoPixelCollison(thisImageXOffset,thisImageYOffset,otherImageXOffset,
otherImageYOffset,pTexture1,pTexture2,
intersectWidth,intersectHeight);
return isCollison;
}
bool CDemoGame: oPixelCollison(int firstXOffset, int firstYOffset, int secondXOffset, int secondYOffset,
LPDIRECT3DTEXTURE9 pTexture1, LPDIRECT3DTEXTURE9 pTexture2, int intersectWidth, int intersectHeight)
{
D3DLOCKED_RECT lock1;
D3DLOCKED_RECT lock2;
DWORD *pPixel1 = new DWORD[intersectHeight*intersectWidth];
DWORD *pPixel2 = new DWORD[intersectHeight*intersectWidth];
memset(pPixel1,0,intersectHeight*intersectWidth);
memset(pPixel2,0,intersectHeight*intersectWidth);
RECT rt1 = {firstXOffset,firstYOffset,firstXOffset+intersectWidth,firstYOffset+intersectHeight};
RECT rt2 = {secondXOffset,secondYOffset,secondXOffset+intersectWidth,secondYOffset+intersectHeight};
pTexture1->LockRect(0,&lock1,&rt1,0);
DWORD *p = (DWORD*)lock1.pBits;
for (int row = 0; row < intersectHeight; row++)
{
for (int col = 0; col < intersectWidth; col++)
{
pPixel1[row * intersectWidth + col] = p[row * intersectWidth + col];
p[row * intersectWidth + col] = D3DXCOLOR(1,1,1,1);
}
}
pTexture1->UnlockRect(0);
pTexture2->LockRect(0,&lock2,&rt2,0);
DWORD *p1 = (DWORD*)lock2.pBits;
for (int row1 = 0; row1 < intersectHeight; row1++)
{
for (int col1 = 0; col1 < intersectWidth; col1++)
{
pPixel2[row1 * intersectWidth + col1] = p1[row1 * intersectWidth + col1];
p1[row1 * intersectWidth + col1] = D3DXCOLOR(1,1,1,1);
}
}
pTexture2->UnlockRect(0);
for (int n = 0; n< intersectHeight; n++)
{
for (int m = 0; m < intersectWidth; m++)
{
D3DXCOLOR c1 = (D3DXCOLOR)pPixel1[n * intersectWidth + m];
D3DXCOLOR c2 = (D3DXCOLOR)pPixel2[n * intersectWidth + m];
if (c1.a !=0 &&c2.a!=0)
{
delete []pPixel1;
delete []pPixel2;
pPixel1 = NULL;
pPixel2 = NULL;
return true;
}
}
}
delete []pPixel1;
delete []pPixel2;
pPixel1 = NULL;
pPixel2 = NULL;
return false;
}
我这里的像素碰撞总是出问题。。
求大神解答..
求技术实现细节 |
|