📄 cracetrack.cpp
字号:
{0,0}};
POINT ptsEndMediumCurveQ3P3[] = { {0,0}, {40,0}, {40,2}, {0,18},
{0,0}};
// Here we mount the race track surface using the tiles of the roads
// we will also CUT the hit checker map so that the map will only
// have the invalid regin of the track. If any ship goes in to this
// region, the ship will explode.
for(int j=0;j<m_iRows;j++)
{
for(int i=0;i<m_iCols;i++)
{
// Get the low order value of the integer
// The low order value represents the type of the road (tile)
// we are using (could be a curve or a plain road). The high
// order word is used to save the check point marks, that are
// used check if the user completed the lap
int iType = LOWORD(m_RoadMap.GetValue(i,j));
switch(iType + ID_ROADTYPE_SRACEROADQ0 - 1)
{
case ID_ROADTYPE_VR_STARTDIAGONALQ0:
m_hcRoadMap.RemovePolyFromBound(pts_VR_StartDiagonalQ0, 5, i*40, j*40);
break;
case ID_ROADTYPE_VR_STARTDIAGONALQ1:
m_hcRoadMap.RemovePolyFromBound(pts_VR_StartDiagonalQ1, 5, i*40, j*40);
break;
case ID_ROADTYPE_VR_STARTDIAGONALQ2:
m_hcRoadMap.RemovePolyFromBound(pts_VR_StartDiagonalQ2, 5, i*40, j*40);
break;
case ID_ROADTYPE_VR_STARTDIAGONALQ3:
m_hcRoadMap.RemovePolyFromBound(pts_VR_StartDiagonalQ3, 5, i*40, j*40);
break;
case ID_ROADTYPE_HZ_ENDDIAGONALQ0:
m_hcRoadMap.RemovePolyFromBound(pts_HZ_EndDiagonalQ0, 4, i*40, j*40);
break;
case ID_ROADTYPE_HZ_ENDDIAGONALQ1:
m_hcRoadMap.RemovePolyFromBound(pts_HZ_EndDiagonalQ1, 4, i*40, j*40);
break;
case ID_ROADTYPE_HZ_ENDDIAGONALQ2:
m_hcRoadMap.RemovePolyFromBound(pts_HZ_EndDiagonalQ2, 4, i*40, j*40);
break;
case ID_ROADTYPE_HZ_ENDDIAGONALQ3:
m_hcRoadMap.RemovePolyFromBound(pts_HZ_EndDiagonalQ3, 4, i*40, j*40);
break;
case ID_ROADTYPE_HZ_STARTDIAGONALQ0:
m_hcRoadMap.RemovePolyFromBound(pts_HZ_StartDiagonalQ0, 5, i*40, j*40);
break;
case ID_ROADTYPE_HZ_STARTDIAGONALQ1:
m_hcRoadMap.RemovePolyFromBound(pts_HZ_StartDiagonalQ1, 5, i*40, j*40);
break;
case ID_ROADTYPE_HZ_STARTDIAGONALQ2:
m_hcRoadMap.RemovePolyFromBound(pts_HZ_StartDiagonalQ2, 5, i*40, j*40);
break;
case ID_ROADTYPE_HZ_STARTDIAGONALQ3:
m_hcRoadMap.RemovePolyFromBound(pts_HZ_StartDiagonalQ3, 5, i*40, j*40);
break;
case ID_ROADTYPE_DIAGONALQ0:
m_hcRoadMap.RemovePolyFromBound(ptsDiagonalQ0, 3, i*40, j*40);
break;
case ID_ROADTYPE_DIAGONALQ1:
m_hcRoadMap.RemovePolyFromBound(ptsDiagonalQ1, 3, i*40, j*40);
break;
case ID_ROADTYPE_DIAGONALQ2:
m_hcRoadMap.RemovePolyFromBound(ptsDiagonalQ2, 3, i*40, j*40);
break;
case ID_ROADTYPE_DIAGONALQ3:
m_hcRoadMap.RemovePolyFromBound(ptsDiagonalQ3, 3, i*40, j*40);
break;
case ID_ROADTYPE_SRACEROADQ0:
m_hcRoadMap.RemoveRectFromBound( (i*40)+20, j*40, 21, 40);
break;
case ID_ROADTYPE_SRACEROADQ1:
m_hcRoadMap.RemoveRectFromBound( (i*40), (j*40), 20, 40);
break;
case ID_ROADTYPE_SRACEROADQ2:
m_hcRoadMap.RemoveRectFromBound( (i*40), (j*40)+18, 40, 20);
break;
case ID_ROADTYPE_SRACEROADQ3:
m_hcRoadMap.RemoveRectFromBound( (i*40), (j*40), 40, 18);
break;
case ID_ROADTYPE_ROADQ0:
m_hcRoadMap.RemoveRectFromBound( (i*40)+20, j*40, 21, 40);
break;
case ID_ROADTYPE_ROADQ1:
m_hcRoadMap.RemoveRectFromBound( (i*40), (j*40), 20, 40);
break;
case ID_ROADTYPE_ROADQ2:
m_hcRoadMap.RemoveRectFromBound( (i*40), (j*40)+18, 40, 22);
break;
case ID_ROADTYPE_ROADQ3:
m_hcRoadMap.RemoveRectFromBound( (i*40), (j*40), 40, 20);
break;
case ID_ROADTYPE_CURVEQ0:
m_hcRoadMap.RemovePolyFromBound(ptsCurveQ0, 7, i*40, j*40);
break;
case ID_ROADTYPE_CURVEQ1:
m_hcRoadMap.RemovePolyFromBound(ptsCurveQ1, 7, i*40, j*40);
break;
case ID_ROADTYPE_CURVEQ2:
m_hcRoadMap.RemovePolyFromBound(ptsCurveQ2, 7, i*40, j*40);
break;
case ID_ROADTYPE_CURVEQ3:
m_hcRoadMap.RemovePolyFromBound(ptsCurveQ3, 7, i*40, j*40);
break;
case ID_ROADTYPE_ENDCURVEQ0:
m_hcRoadMap.RemovePolyFromBound(ptsEndCurveQ0, 5, i*40, j*40);
break;
case ID_ROADTYPE_ENDCURVEQ1:
m_hcRoadMap.RemovePolyFromBound(ptsEndCurveQ1, 5, i*40, j*40);
break;
case ID_ROADTYPE_ENDCURVEQ2:
m_hcRoadMap.RemovePolyFromBound(ptsEndCurveQ2, 5, i*40, j*40);
break;
case ID_ROADTYPE_ENDCURVEQ3:
m_hcRoadMap.RemovePolyFromBound(ptsEndCurveQ3, 5, i*40, j*40);
break;
case ID_ROADTYPE_MIDDIAGONALQ0:
case ID_ROADTYPE_MIDDIAGONALQ1:
case ID_ROADTYPE_MIDDIAGONALQ2:
case ID_ROADTYPE_MIDDIAGONALQ3:
case ID_ROADTYPE_FULLROADQ0:
case ID_ROADTYPE_FULLROADQ1:
case ID_ROADTYPE_FULLROADQ2:
case ID_ROADTYPE_FULLROADQ3:
case ID_ROADTYPE_FULLROADQ4:
case ID_ROADTYPE_FULLROADQ5:
case ID_ROADTYPE_FULLROADQ6:
case ID_ROADTYPE_FULLROADQ7:
case ID_ROADTYPE_FULLROADQ8:
case ID_ROADTYPE_FULLROADQ9:
case ID_ROADTYPE_FULLROADQ10:
case ID_ROADTYPE_FULLROADQ11:
case ID_ROADTYPE_FULLROADQ12:
case ID_ROADTYPE_FULLROADQ13:
case ID_ROADTYPE_FULLROADQ14:
case ID_ROADTYPE_FULLROADQ15:
case ID_ROADTYPE_FULLROADQ16:
case ID_ROADTYPE_FULLROADQ17:
m_hcRoadMap.RemoveRectFromBound( (i*40), (j*40), 40, 40);
break;
case ID_ROADTYPE_MEDIUMCURVEQ0P1:
m_hcRoadMap.RemovePolyFromBound(ptsMediumCurveQ0P1, 6, i*40, j*40);
break;
case ID_ROADTYPE_MEDIUMCURVEQ0P2:
m_hcRoadMap.RemoveRectFromBound( (i*40), (j*40), 40, 40);
break;
case ID_ROADTYPE_MEDIUMCURVEQ0P3:
m_hcRoadMap.RemovePolyFromBound(ptsMediumCurveQ0P3, 4, i*40, j*40);
break;
case ID_ROADTYPE_MEDIUMCURVEQ1P1:
m_hcRoadMap.RemovePolyFromBound(ptsMediumCurveQ1P1, 6, i*40, j*40);
break;
case ID_ROADTYPE_MEDIUMCURVEQ1P2:
m_hcRoadMap.RemoveRectFromBound( (i*40), (j*40), 40, 40);
break;
case ID_ROADTYPE_MEDIUMCURVEQ1P3:
m_hcRoadMap.RemovePolyFromBound(ptsMediumCurveQ1P3, 4, i*40, j*40);
break;
case ID_ROADTYPE_MEDIUMCURVEQ2P1:
m_hcRoadMap.RemovePolyFromBound(ptsMediumCurveQ2P1, 6, i*40, j*40);
break;
case ID_ROADTYPE_MEDIUMCURVEQ2P2:
m_hcRoadMap.RemoveRectFromBound( (i*40), (j*40), 40, 40);
break;
case ID_ROADTYPE_MEDIUMCURVEQ2P3:
m_hcRoadMap.RemovePolyFromBound(ptsMediumCurveQ2P3, 4, i*40, j*40);
break;
case ID_ROADTYPE_MEDIUMCURVEQ3P1:
m_hcRoadMap.RemovePolyFromBound(ptsMediumCurveQ3P1, 6, i*40, j*40);
break;
case ID_ROADTYPE_MEDIUMCURVEQ3P2:
m_hcRoadMap.RemoveRectFromBound( (i*40), (j*40), 40, 40);
break;
case ID_ROADTYPE_MEDIUMCURVEQ3P3:
m_hcRoadMap.RemovePolyFromBound(ptsMediumCurveQ3P3, 4, i*40, j*40);
break;
case ID_ROADTYPE_ENDMEDIUMCURVEQ0P1:
m_hcRoadMap.RemovePolyFromBound(ptsEndMediumCurveQ0P1, 5, i*40, j*40);
break;
case ID_ROADTYPE_ENDMEDIUMCURVEQ0P2:
break;
case ID_ROADTYPE_ENDMEDIUMCURVEQ0P3:
m_hcRoadMap.RemovePolyFromBound(ptsEndMediumCurveQ0P3, 5, i*40, j*40);
break;
case ID_ROADTYPE_ENDMEDIUMCURVEQ1P1:
m_hcRoadMap.RemovePolyFromBound(ptsEndMediumCurveQ1P1, 5, i*40, j*40);
break;
case ID_ROADTYPE_ENDMEDIUMCURVEQ1P2:
break;
case ID_ROADTYPE_ENDMEDIUMCURVEQ1P3:
m_hcRoadMap.RemovePolyFromBound(ptsEndMediumCurveQ1P3, 5, i*40, j*40);
break;
case ID_ROADTYPE_ENDMEDIUMCURVEQ2P1:
m_hcRoadMap.RemovePolyFromBound(ptsEndMediumCurveQ2P1, 5, i*40, j*40);
break;
case ID_ROADTYPE_ENDMEDIUMCURVEQ2P2:
break;
case ID_ROADTYPE_ENDMEDIUMCURVEQ2P3:
m_hcRoadMap.RemovePolyFromBound(ptsEndMediumCurveQ2P3, 5, i*40, j*40);
break;
case ID_ROADTYPE_ENDMEDIUMCURVEQ3P1:
m_hcRoadMap.RemovePolyFromBound(ptsEndMediumCurveQ3P1, 5, i*40, j*40);
break;
case ID_ROADTYPE_ENDMEDIUMCURVEQ3P2:
break;
case ID_ROADTYPE_ENDMEDIUMCURVEQ3P3:
m_hcRoadMap.RemovePolyFromBound(ptsEndMediumCurveQ3P3, 5, i*40, j*40);
break;
}
}
}
// Create the race Completed surface
m_surfRaceCompleted.Create(150,90,RGB(0,0,0));
m_surfRaceCompleted.LoadBitmap(GetMainApp()->m_hInst, IDB_RACECOMPLETED);
}
BOOL cRaceTrack::ReadFromFile(char *lpszFile)
{
// This function is used to load a race track from a race track file
// The file have a header with the track name, the number of laps
// and Track Dimensions.
//
// After the header we have an array of DWORD (based on the dimensions)
// that have the tile information
Destroy();
FILE* hFile;
int iCols;
int iRows;
int iTile;
int iValue;
int iSize;
char pBufferHeader[2];
// Open the track file
hFile = fopen(lpszFile, "rb");
if(hFile == NULL)
return FALSE;
m_sFileName = lpszFile;
// Read the header
fread((void*) pBufferHeader, sizeof(char), 2, hFile);
// Read the size of the track name string
fread((void*) &iSize, sizeof(int), 1, hFile);
m_sTrackName = (char*) malloc(iSize+1);
memset(m_sTrackName, '\0', iSize+1);
fread((void*) m_sTrackName, sizeof(char), iSize, hFile);
// Read the number of laps
fread((void*) &m_iLaps, sizeof(int), 1, hFile);
// Read the track dimension
fread((void*) &iCols, sizeof(int), 1, hFile);
fread((void*) &iRows, sizeof(int), 1, hFile);
// Read the Race Tile
fread((void*) &iTile, sizeof(int), 1, hFile);
// Now that we have the dimensions, read the DWORD array
int iRead = 0;
Create(iCols, iRows);
SetTile(iTile);
for(int j=0;j<iRows;j++)
{
for(int i=0;i<iCols;i++)
{
iRead = fread((void*) &iValue, sizeof(int),1,hFile);
m_RoadMap.SetValue(i,j,iValue);
}
}
fclose(hFile);
// Race track is loaded, remove the polygonal regions of the cHitCheck class
RemoveHitRegion();
return TRUE;
}
void cRaceTrack::GetStartPosition(int *iX, int *iY)
{
int i, j, iValue;
// This function is used to search where is the Race Start Tile
for(j=0; j<m_iRows; j++)
{
for(i=0; i<m_iCols; i++)
{
iValue = LOWORD(m_RoadMap.GetValue(i,j)) + ID_ROADTYPE_SRACEROADQ0 - 1;
if(iValue >= ID_ROADTYPE_SRACEROADQ0 &&
iValue <= ID_ROADTYPE_SRACEROADQ3)
{
*iX = i*40;
*iY = j*40;
if(iValue == ID_ROADTYPE_SRACEROADQ0)
*iX = (i*40)+20;
if(iValue == ID_ROADTYPE_SRACEROADQ2)
*iY = (j*40)+20;
return;
}
}
}
}
void cRaceTrack::AdjustView(cRaceCar *pCar)
{
#define VIEW_RANGEX 320
#define VIEW_RANGEY 230
// This function will adjust the current view based on the player磗 car
// current position
int iX, iY;
pCar->GetPos(&iX, &iY);
if(iX + VIEW_RANGEX >= m_iViewX + 640)
{
m_iViewX += (iX + VIEW_RANGEX)-(m_iViewX + 640);
}
if(iY + VIEW_RANGEY > m_iViewY + 480)
{
m_iViewY += (iY + VIEW_RANGEY)-(m_iViewY + 480);
}
if(iY - VIEW_RANGEY < m_iViewY)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -