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

📄 racex.cpp

📁 Visual C++ 游戏开发与设计实例 源代码(所有)
💻 CPP
📖 第 1 页 / 共 5 页
字号:
						iStart = 0;
						m_sndSelect.Play();
						lLastOption = GetTickCount();
					}
					else
					{
						// Single Player - Single Track
						// Go to the Track selection Screen
						m_iState = GS_RACE;
						iStart = 0;
						m_sndSelect.Play();
						lLastOption = GetTickCount();
					}
				}
			}

			if(m_Keyboard.CheckKey(DIK_ESCAPE))
			{
				m_iState = GS_MAINSCREEN;
				iStart = 0;
				m_surfHelmet.Destroy();
				pRaceTrack.Destroy();
				m_sptrCar.Destroy();
				lLastOption = GetTickCount();
			}


		}
		break;

	case GS_RACE:
		// Draw the Race Track on the screen
		pRaceTrack.Draw(0,0, -1, -1, 640, 460);
		if(iStart == 0)
		{
			m_surfTitle.Destroy();

			// We haven磘 create the cars yet
			// Create the cars based on the cCompetition class information
			for(i=0;i<m_pCompetition.GetNumberOfCars();i++)
			{
				pCar = new cRaceCar;
				pCar->Create(m_pCompetition.GetColor(i));
				pCar->SetControlType(m_pCompetition.GetControlType(i));
				pCar->SetID(m_pCompetition.GetPlayerID(i));
				pRaceTrack.AddCar(pCar);
			}

			iStart = 1;
		}

		// Process the keyboard input
		m_Keyboard.Process();

		if(m_Keyboard.CheckKey(DIK_ESCAPE))
		{
			m_iState = GS_MAINSCREEN;
			iStart = 0;
			m_surfHelmet.Destroy();
			pRaceTrack.Destroy();
			lLastOption = GetTickCount();
			break;
		}

		// Process the Race Track
		pRaceTrack.Process();

		for(i=0;i<m_pCompetition.GetNumberOfCars();i++)
		{
			if(pRaceTrack.m_pRaceCars[i]->GetControlType() == CTRL_USER || pRaceTrack.m_pRaceCars[i]->GetControlType() == CTRL_NETWORK_LOCAL)
			{
				pCar = pRaceTrack.m_pRaceCars[i];

				DWORD dwFreq = 0;

			}
		}
	
		// Write the race stats on the screen
		sprintf(buffer, "LAPS %02d", pCar->m_iLaps);
		m_txDigital.WriteText(m_pBackBuffer, buffer, 2, 463);

		sprintf(buffer, "SPEED %003dKM", pCar->GetSpeed());
		m_txDigital.WriteText(m_pBackBuffer, buffer, 125, 463);

		sprintf(buffer, "POSITION %d", pCar->GetPosition());
		m_txDigital.WriteText(m_pBackBuffer, buffer, 315, 463);


		lStart = 0;

		m_txDigitalSmall.WriteText(m_pBackBuffer, "ELAPSE TIME -", 472, 461);
		m_txDigitalSmall.WriteText(m_pBackBuffer, "LAST LAP TIME -", 460, 471);

		if(pCar->GetCarState() != CARSTATE_RACECOMPLETED)
			lStart = pCar->GetLapElapseTime();
		sprintf(buffer,"%02d:%02d:%003d", (lStart / 60000), (lStart / 1000) % 60, lStart % 1000);
		m_txDigitalSmall.WriteText(m_pBackBuffer, buffer, 575, 461, true);

		lStart = pCar->GetLastLapTime();
		sprintf(buffer,"%02d:%02d:%003d", (lStart / 60000), (lStart / 1000) % 60, lStart % 1000);
		m_txDigitalSmall.WriteText(m_pBackBuffer, buffer, 575, 471, true);

		if( pCar->GetCarState() == CARSTATE_RACECOMPLETED &&
			pCar->GetLapElapseTime() > 4000)
		{
			if(m_bIsMultiplayer == TRUE)
			{
				int iNumCompleted = 0;
				for(i=0;i<pRaceTrack.GetNumberOfCars();i++)
				{
					if(pRaceTrack.m_pRaceCars[i]->GetCarState() == CARSTATE_RACECOMPLETED)
						iNumCompleted++;
				}

				if(iNumCompleted == pRaceTrack.GetNumberOfCars())
				{
					m_iState = GS_RACECOMPLETED;
					iStart = 0;
					lLastOption = GetTickCount();
				}
			}
			else
			{
				m_iState = GS_RACECOMPLETED;
				iStart = 0;
				lLastOption = GetTickCount();
			}
		}
		break;

	case GS_RACECOMPLETED:
		// When the user completes the race, this screen is showed
		// It shows the position of each player in the race and
		// the elapse time of each lap
		long	lBestLapTime, lAvarageLapTime;

		lBestLapTime = 999999999;
		lAvarageLapTime = 0;

		if(iStart == 0)
		{
			iStart = 1;

			for(i=0;i<4;i++)
			{
				m_surfBigCars[i].Create(150, 140, RGB(0,0,0));
				m_surfBigCars[i].LoadBitmap(GetInstHandle(), IDB_BIGCAR_BLUE + i);
			}

			m_sndSelect.Create(MAKEINTRESOURCE(IDR_FINISHEDRACE), DSBCAPS_STATIC , DS3DALG_DEFAULT);
			//m_sndSelect.SetPosition(0.0f,0.0f,0.0f);

			m_sndSelect.Play(0, DSBPLAY_LOOPING);

			for(i=0;i<pRaceTrack.GetNumberOfCars();i++)
			{
				pTmpCar = pRaceTrack.GetCar(i);
				m_pCompetition.AddPointToPlayer(pTmpCar->GetID(), 3-i);
			}

			m_surfCarPannel.Create(320,110, RGB(0,0,0));
			m_surfCarPannel.LoadBitmap(GetInstHandle(), IDB_CAR_PANNEL);

			m_surfHelmet.Create(320,280, RGB(0,0,0));
			m_surfHelmet.LoadBitmap(GetInstHandle(), IDB_LAP_RESULTS_PANNEL);

			m_surfPanel.Create(320,160, RGB(0,0,0));
			m_surfPanel.LoadBitmap(GetInstHandle(), IDB_RACE_STATS);
			
			m_surfTitle.Create(400,40, RGB(0,0,0));
			m_surfTitle.LoadBitmap(GetInstHandle(), IDB_RACERESULTS_TITLE);

			m_surfPositions.Create(120,40, RGB(0,0,0));
			m_surfPositions.LoadBitmap(GetInstHandle(), IDB_POSITIONS);

		}

		m_surfTitle.Draw(m_pBackBuffer, 120, 0);
		for(i=0;i<pRaceTrack.GetNumberOfCars();i++)
		{
			pTmpCar = pRaceTrack.GetCar(i);
			
			//m_txVerdana.WriteText(m_pBackBuffer, "RACE RESULTS", 20, 5);

			m_surfBigCars[pTmpCar->GetCarColor() - IDB_CAR_BLUE].Draw(m_pBackBuffer, 10, 40 + (i * 110), 20, 14, 130, 106);
			m_surfCarPannel.Draw(m_pBackBuffer, 0, 40 + (i * 110));
			m_surfPositions.Draw(m_pBackBuffer, 130, 42 + (i*110), i*30, 0, 30, 40);
			
			//sprintf(buffer,"%d", i+1);
			//m_txVerdana.WriteText(m_pBackBuffer, buffer, 160, 30 + (i * 110));
			sTmp = m_pCompetition.GetPlayerName(pTmpCar->GetID());
			m_txDigitalSmall.WriteText(m_pBackBuffer, &sTmp[0], 145, 118 + (i*110));

			if(pTmpCar->GetControlType() == CTRL_USER || pTmpCar->GetControlType() == CTRL_NETWORK_LOCAL)
			{
				//m_txVerdana.WriteText(m_pBackBuffer, "YOU FINISHED THE RACE", 320, 300);
				//sprintf(buffer, "IN THE %dTH POSITION", pTmpCar->GetPosition());
				//m_txVerdana.WriteText(m_pBackBuffer, buffer, 320, 320);


				int j;
				for(j=0;j<pRaceTrack.GetNumberOfLaps();j++)
				{
					sprintf(buffer,"LAP %d", j+1);
					m_txDigitalSmall.WriteText(m_pBackBuffer, buffer, 340, 90 + (j * 12), false);
										
					lStart = pTmpCar->GetLapElapseTime(j);
					if(lStart < lBestLapTime)
						lBestLapTime = lStart;
					lAvarageLapTime+= lStart;

					sprintf(buffer,"%02d:%02d:%003d", (lStart / 60000), (lStart / 1000) % 60, lStart % 1000);
					m_txDigitalSmall.WriteText(m_pBackBuffer, buffer, 400, 90 + (j * 12), true);
				}
			}

		}



		m_surfHelmet.Draw(m_pBackBuffer, 320, 40);
		m_surfPanel.Draw(m_pBackBuffer, 320, 320);

		lAvarageLapTime /= pRaceTrack.GetNumberOfLaps(); 
		sprintf(buffer,"%02d:%02d:%003d", (lAvarageLapTime / 60000), (lAvarageLapTime / 1000) % 60, lAvarageLapTime % 1000);
		m_txDigitalSmall.WriteText(m_pBackBuffer, buffer, 544, 350, true);

		sprintf(buffer,"%02d:%02d:%003d", (lBestLapTime / 60000), (lBestLapTime / 1000) % 60, lBestLapTime % 1000);
		m_txDigitalSmall.WriteText(m_pBackBuffer, buffer, 544, 382 , true);


		// Process the keyboard for input
		m_Keyboard.Process();

		if(GetTickCount() - lLastOption > 200)
		{
			if(m_Keyboard.CheckKey(DIK_RETURN) ||
			   m_Keyboard.CheckKey(DIK_NUMPADENTER))
			{
				
				if(m_pCompetition.GetCompetitionMode() == TRUE)
				{
					for(i=0;i<4;i++)
					{
						m_surfBigCars[i].Destroy();
					}
					m_sndSelect.Stop(TRUE);
					pRaceTrack.Destroy();
					m_sptrCar.Destroy();

					m_surfTitle.Destroy();
					m_surfCarPannel.Destroy();
					m_surfHelmet.Destroy();
					m_surfPositions.Destroy();

					
					m_pCompetition.NextRace();
					m_pCompetition.ResetReadyState();
					m_iState = GS_COMPETITIONSTATUS;
					iStart = 0;
					//m_sndSelect.Play();
					lLastOption = GetTickCount();
				}
				else
				{
					for(i=0;i<4;i++)
					{
						m_surfBigCars[i].Destroy();
					}
					m_surfTitle.Destroy();
					m_surfCarPannel.Destroy();
					m_surfHelmet.Destroy();
					m_surfPositions.Destroy();


					m_sndSelect.Stop(TRUE);
					//m_sndSelect.Destroy();
					pRaceTrack.Destroy();
					m_sptrCar.Destroy();

					m_iState = GS_MAINSCREEN;
					iStart = 0;
					//m_sndSelect.Play();
					lLastOption = GetTickCount();
				}
				break;
			}
		}

		break;

	case GS_COMPETITIONSTATUS:
		// Shows the competition status
		// It shows the position of each player in the competition and
		// the next race information
		// If the competition is finished, show the tophy for the player
		
		BOOL	bFinished;
		int		iPosition;

		iPosition = 4;

		for(i=0;i<4;i++)
		{
			if(m_pCompetition.GetControlType(i) == CTRL_USER || m_pCompetition.GetControlType(i) == CTRL_NETWORK_LOCAL)
			{
				iPosition = i+1;
				break;
			}
		}

		if(m_pCompetition.GetNextRace() == "")
			bFinished = TRUE;
		else
			bFinished = FALSE;

		if(iStart == 0)
		{
			iStart = 1;
			m_surfTitle.Destroy();

			for(i=0;i<4;i++)
			{
				m_surfBigCars[i].Create(750, 560, RGB(0,0,0));
				m_surfBigCars[i].LoadBitmap(GetInstHandle(), IDB_BIGCAR_BLUE + i);

			}


			m_surfCarPannel.Create(320,110, RGB(0,0,0));
			m_surfCarPannel.LoadBitmap(GetInstHandle(), IDB_CAR_PANNEL_COMPETITION);

			m_surfTitle.Create(600,40, RGB(0,0,0));
			m_surfTitle.LoadBitmap(GetInstHandle(), IDB_COMPETITIONSTATUS_TITLE);

			m_surfPositions.Create(120,40, RGB(0,0,0));
			m_surfPositions.LoadBitmap(GetInstHandle(), IDB_POSITIONS);

			m_surfHelmet.Create(320,440, RGB(0,0,0));
			if(bFinished)
			{
				m_surfHelmet.LoadBitmap(GetInstHandle(), IDB_FINISHCOMPETITION_PANEL);
				m_surfTophy.Create(280,300);
				switch(iPosition)
				{
				case 1:
					m_surfTophy.LoadBitmap(GetInstHandle(), IDB_TOPHY_GOLD);
					break;
				case 2:
					m_surfTophy.LoadBitmap(GetInstHandle(), IDB_TOPHY_SILVER);
					break;
				case 3:
					m_surfTophy.LoadBitmap(GetInstHandle(), IDB_TOPHY_COOPER);
					break;
				case 4:
					m_surfTophy.LoadBitmap(GetInstHandle(), IDB_TOPHY_NONE);
					break;
				}
			}
			else
				m_surfHelmet.LoadBitmap(GetInstHandle(), IDB_NEXTRACEINFO_PANEL);

			pRaceTrack.Destroy();
			if(!bFinished)
				pRaceTrack.ReadFromFile(&m_pCompetition.GetNextRace()[0]);

		}

		if(bFinished)
		{
			m_surfTophy.Draw(m_pBackBuffer, 340, 60);
		}

		m_surfTitle.Draw(m_pBackBuffer, 20, 0);
		m_surfHelmet.Draw(m_pBackBuffer, 320, 40);

		for(i=0;i<m_pCompetition.GetNumberOfCars();i++)
		{
			m_surfBigCars[m_pCompetition.GetColor(i) - IDB_CAR_BLUE].Draw(m_pBackBuffer, 10, 40 + (i * 110), 20, 14, 130, 106);
			m_surfCarPannel.Draw(m_pBackBuffer, 0, 40 + (i * 110));
			m_surfPositions.Draw(m_pBackBuffer, 130, 42 + (i*110), i*30, 0, 30, 40);

			sTmp = m_pCompetition.GetPlayerName(m_pCompetition.GetPlayerID(i));
			m_txDigitalSmall.WriteText(m_pBackBuffer, &sTmp[0], 145, 110 + (i*110));

			sprintf(buffer,"%d", m_pCompetition.GetPlayerPointsByPosition(i));
			m_txDigitalSmall.WriteText(m_pBackBuffer, buffer, 285, 130 + (i*110));
		}

		
		if(bFinished)
		{
			sprintf(buffer, "YOU FINISHED THE COMPETITION", iPosition);
			m_txDigitalSmall.WriteText(m_pBackBuffer, buffer, 375, 380);
			sprintf(buffer, "IN THE %dTH POSITION.", iPosition);
			m_txDigitalSmall.WriteText(m_pBackBuffer, buffer, 405, 395);

			switch(iPosition)
			{
			case 1:
				sprintf(buffer, "CONGRATS, YOU GOT THE GOLDEN TOPHY");
				break;
			case 2:
				sprintf(buffer, "CONGRATS, YOU GOT THE SILVER TOPHY");
				break;
			case 3:
				sprintf(buffer, "CONGRATS, YOU GOT THE COOPER TOPHY");
				break;
			case 4:
				sprintf(buffer, "SORRY, NO TOPHY FOR SLOW DRIVERS.");
				break;
			}
			m_txDigitalSmall.WriteText(m_pBackBuffer, buffer, 354, 410);
		}
		else
		{
			sprintf(buffer, "%.2d", pRaceTrack.GetNumberOfLaps());

			m_txDigital.WriteText(m_pBackBuffer, pRaceTrack.GetTrackName(), 350, 144);
			m_txDigital.WriteText(m_pBackBuffer, buffer, 582, 194);
		}

		// Process the keyboard for input
		m_Keyboard.Process();

		if(GetTickCount() - lLastOption > 200)
		{
			if(m_Keyboard.CheckKey(DIK_RETURN) ||
			   m_Keyboard.CheckKey(DIK_NUMPADENTER))
			{
				
				for(i=0;i<4;i++)
				{
					m_surfBigCars[i].Destroy();
				}

				m_surfTitle.Destroy();
				m_surfCarPannel.Destroy();
				m_surfHelmet.Destroy();
				m_surfPositions.Destroy();
				m_surfTophy.Destroy();

				m_sptrCar.Destroy();
				if(bFinished)
				{
					m_iState = GS_MAINSCREEN;
				}
				else
				{
					if(m_bIsMultiplayer == TRUE)
					{
						if(m_pMultiPlayer.IsHosting())
						{
							m_pCompetition.SetReadyState(0,TRUE);
							if(m_pCompetition.AllPlayersReady())
							{
								m_iState = GS_RACE;

								strcpy(buffer, pRaceTrack.GetFileName());
								i = strlen(buffer);
								m_pMultiPlayer.SendTo(0, MSG_START_RACE, (unsigned char *) &buffer[0], i, DPNSEND_SYNC | DPNSEND_NOLOOPBACK | DPNSEND_GUARANTEED);
								m_iState = GS_RACE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -