cHitChecker.cpp
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:4k
- #include "stdafx.h"
- #include "cHitChecker.h"
- #include <stdio.h>
- //////////////////////////////////////////////////////////////////////
- // Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- cHitChecker::cHitChecker()
- {
- hBoundingPoly = NULL;
- }
- cHitChecker::~cHitChecker()
- {
- if(hBoundingPoly != NULL)
- {
- DeleteObject(hBoundingPoly);
- }
- }
- void cHitChecker::CreateRectBound(int nWidth,int nHeight)
- {
- // if this class already have a rgn defined, destroyed
- Destroy();
- hBoundingPoly = CreateRectRgn(0, 0, nWidth, nHeight);
- }
- void cHitChecker::RemoveRectFromBound(int nX, int nY, int nWidth, int nHeight)
- {
- // Use the combine Rgn API to remove a rect from the class internal region
- HRGN hRgnSrc = NULL;
- hRgnSrc = CreateRectRgn(nX, nY, nWidth+nX, nHeight+nY);
-
- int iRet = CombineRgn(hBoundingPoly, hBoundingPoly, hRgnSrc, RGN_DIFF);
-
- DeleteObject(hRgnSrc);
- }
- void cHitChecker::RemovePolyFromBound(LPPOINT lpPoints, int iCount, int iX, int iY)
- {
- // Use the combine Rgn API to remove a poly from the class internal region
- HRGN hRgnSrc = NULL;
- LPPOINT pStart = lpPoints;
- if(iX != 0)
- {
- for(int i=0;i<iCount;i++)
- {
- lpPoints->x = lpPoints->x + iX;
- lpPoints->y = lpPoints->y + iY;
- lpPoints++;
- }
- lpPoints = pStart;
- }
-
- hRgnSrc = CreatePolygonRgn(lpPoints, iCount, ALTERNATE);
- if(hRgnSrc == NULL)
- {
- DXTRACE_MSG("ERROR !");
- }
- CombineRgn(hBoundingPoly, hBoundingPoly, hRgnSrc, RGN_DIFF);
- DeleteObject(hRgnSrc);
- if(iX != 0)
- {
- for(int i=0;i<iCount;i++)
- {
- lpPoints->x = lpPoints->x - iX;
- lpPoints->y = lpPoints->y - iY;
- lpPoints++;
- }
- lpPoints = pStart;
- }
- }
- void cHitChecker::CreatePolygonBound(LPPOINT lpPoints, int nCount)
- {
- // Use the combine Rgn API to remove a poly from the class internal region
- Destroy();
- hBoundingPoly = CreatePolygonRgn(lpPoints, nCount, ALTERNATE);
- }
- BOOL cHitChecker::HaveHitted(cHitChecker *pHitCheck, int nX, int nY, int nSrcX, int nSrcY)
- {
- HRGN hSrcObjectRgn;
- HRGN hCompObjectRgn;
- BOOL bResult = FALSE;
- DWORD dwSize;
- UINT i = 0;
- RGNDATA* rgnData;
- // First check the bounding rectangle
- RECT rcObj;
- GetRgnBox(pHitCheck->hBoundingPoly,&rcObj);
- rcObj.top += nY; rcObj.bottom += nY;
- rcObj.left += nX; rcObj.right += nX;
- if(nSrcX!=0 && nSrcY!=0)
- {
- OffsetRgn(hBoundingPoly, nSrcX, nSrcY);
- if(RectInRegion(hBoundingPoly, &rcObj) == 0)
- {
- OffsetRgn(hBoundingPoly, -nSrcX, -nSrcY);
- return FALSE;
- }
- OffsetRgn(hBoundingPoly, -nSrcX, -nSrcY);
- }
- else
- {
- if(RectInRegion(hBoundingPoly, &rcObj) == 0)
- return FALSE;
- }
- dwSize = GetRegionData(pHitCheck->hBoundingPoly, sizeof(RGNDATA), NULL);
- rgnData = (RGNDATA*) malloc(dwSize);
- GetRegionData(pHitCheck->hBoundingPoly, dwSize, rgnData);
- hSrcObjectRgn = ExtCreateRegion(NULL, dwSize, rgnData);
-
- OffsetRgn(hSrcObjectRgn, nX, nY);
- dwSize = GetRegionData(hSrcObjectRgn, sizeof(RGNDATA), NULL);
- rgnData = (RGNDATA*) realloc(rgnData, dwSize);
- GetRegionData(hSrcObjectRgn, dwSize, rgnData);
-
- if(nSrcX !=0 && nSrcY !=0)
- {
- RGNDATA* rgnData2;
- // Same copy for the region being tested
- dwSize = GetRegionData(hBoundingPoly, sizeof(RGNDATA), NULL);
- rgnData2 = (RGNDATA*) malloc(dwSize);
- GetRegionData(hBoundingPoly, dwSize, rgnData2);
- hCompObjectRgn = ExtCreateRegion(NULL, dwSize, rgnData2);
- OffsetRgn(hCompObjectRgn, nSrcX, nSrcY);
- bResult = TRUE;
- for(i=0;i<rgnData->rdh.nCount;i++)
- {
- memcpy(&rcObj, &rgnData->Buffer[i*sizeof(RECT)], sizeof(RECT));
- if(RectInRegion(hCompObjectRgn, &rcObj) != 0)
- {
- bResult = FALSE;
- break;
- }
- }
- free(rgnData2);
- DeleteObject(hCompObjectRgn);
- }
- else
- {
- bResult = TRUE;
- for(i=0;i<rgnData->rdh.nCount;i++)
- {
- memcpy(&rcObj, &rgnData->Buffer[i*sizeof(RECT)], sizeof(RECT));
- if(RectInRegion(hBoundingPoly, &rcObj) != 0)
- {
- bResult = FALSE;
- break;
- }
- }
- }
- free((void*)rgnData);
- // Free the resources
- DeleteObject(hSrcObjectRgn);
- return !bResult;
- }
- void cHitChecker::Destroy()
- {
- // If we have a region, destroy it
- if(hBoundingPoly != NULL)
- {
- DeleteObject(hBoundingPoly);
- }
- }