📄 racex.cpp
字号:
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 + -