⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cracetrack.cpp

📁 Visual C++游戏开发技术与实例一书配套光盘。包含了冒险屠宰场、入侵者、赛车、网络五子棋、网络台球、对战坦克大战和面包圈7个游戏实例的完整源代码。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
										{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 + -