📄 game.cpp
字号:
// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
boolean CGame::KeyPressEvent(uint16 wParam)
{
switch(wParam)
{
case AVK_SELECT:
m_kSELECT = true;
return TRUE;
case AVK_LEFT:
m_kLEFT = true;
return TRUE;
case AVK_RIGHT:
m_kRIGHT = true;
return TRUE;
case AVK_UP:
m_kUP = true;
return TRUE;
case AVK_DOWN:
m_kDOWN = true;
return TRUE;
case AVK_1:
return TRUE;
case AVK_2:
return TRUE;
case AVK_3:
return TRUE;
case AVK_4:
return TRUE;
case AVK_5:
return TRUE;
case AVK_6:
return TRUE;
case AVK_7:
return TRUE;
case AVK_8:
return TRUE;
case AVK_9:
return TRUE;
case AVK_STAR:
return TRUE;
case AVK_0:
return TRUE;
case AVK_POUND:
return TRUE;
case AVK_CLR:
m_kCLEAR = true;
return TRUE;
}
return TRUE;
}
// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
boolean CGame::KeyReleaseEvent(uint16 wParam)
{
switch(wParam)
{
case AVK_SELECT:
m_kSELECT = false;
return TRUE;
case AVK_LEFT:
m_kLEFT = false;
return TRUE;
case AVK_RIGHT:
m_kRIGHT = false;
return TRUE;
case AVK_UP:
m_kUP = false;
return TRUE;
case AVK_DOWN:
m_kDOWN = false;
return TRUE;
case AVK_1:
return TRUE;
case AVK_2:
return TRUE;
case AVK_3:
return TRUE;
case AVK_4:
return TRUE;
case AVK_5:
return TRUE;
case AVK_6:
return TRUE;
case AVK_7:
return TRUE;
case AVK_8:
return TRUE;
case AVK_9:
return TRUE;
case AVK_STAR:
return TRUE;
case AVK_0:
return TRUE;
case AVK_POUND:
return TRUE;
case AVK_CLR:
m_kCLEAR = false;
return TRUE;
}
return TRUE;
}
// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
void CGame::NextFrame(CGame* pGame)
{
IDISPLAY_Backlight(pGame->m_applet.m_pIDisplay, TRUE);
// ----------------------------------------------------------------------------------
pGame->RenderFrame();
// ----------------------------------------------------------------------------------
ISHELL_SetTimer(pGame->m_applet.m_pIShell, 33, (PFNNOTIFY)NextFrame, (void *)pGame);
}
// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
void CGame::RenderFrame()
{
// -----------------------------------------------------------------------------------------
// clear everything
// -----------------------------------------------------------------------------------------
#if 1
glClearColorx(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
#else
glClear(GL_DEPTH_BUFFER_BIT);
#endif
switch (m_jGameStatus)
{
case STATUS_START:
{
RenderStart();
break;
}
case STATUS_LOADING:
{
if (!LoadResources()) ISHELL_CloseApplet(m_applet.m_pIShell, 0);
m_pSpr8x13->DrawText32To90((m_pEngine->ScreenWidth()-88)>>1, (m_pEngine->ScreenHeight()-13)>>1, "- LOADING -");
m_dwFrame = 0;
m_jGameStatus = STATUS_INTRO;
break;
}
case STATUS_INTRO:
{
RenderIntro();
break;
}
case STATUS_NEWLEVEL:
{
RenderNewLevel();
break;
}
case STATUS_PLAYING:
{
RenderGame();
break;
}
case STATUS_DYING:
{
RenderDying();
break;
}
case STATUS_PASSLEVEL:
{
RenderPassLevel();
break;
}
case STATUS_GAMEOVER:
{
RenderGameOver();
break;
}
}
// -----------------------------------------------------------------------------------------
//
// swap buffers and update screen
m_pEngine->SwapBuffers();
IDISPLAY_Update(m_applet.m_pIDisplay);
//
// -----------------------------------------------------------------------------------------
}
// ----------------------------------------------------------------------------------------------------------
//
//
//
// ----------------------------------------------------------------------------------------------------------
void CGame::RenderStart()
{
if (m_dwFrame == 0)
{
if (m_kCLEAR || m_kSELECT) return;
// load 8x13 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ font sprite
m_pSpr8x13 = new CSprite(m_pEngine);
m_pSpr8x13->LoadFromVfs("game.dat", "font_8x13.bmp");
int16 jFrm8x13[58*6];
int yy, pp=0, f8x13offx=0;
for (yy=0; yy<58; yy++)
{
jFrm8x13[pp++] = f8x13offx;
jFrm8x13[pp++] = 0;
jFrm8x13[pp++] = 0;
jFrm8x13[pp++] = 0;
jFrm8x13[pp++] = 8;
jFrm8x13[pp++] = 13;
f8x13offx += 8;
}
m_pSpr8x13->Config(58, jFrm8x13);
}
if (m_dwFrame)
{
m_pSpr8x13->DrawText32To90((m_pEngine->ScreenWidth()-88)>>1, (m_pEngine->ScreenHeight()-13)>>1, "- LOADING -");
m_jGameStatus = STATUS_LOADING;
return;
}
m_dwFrame++;
}
// ----------------------------------------------------------------------------------------------------------
//
// Render a intro frame
//
// ----------------------------------------------------------------------------------------------------------
void CGame::RenderIntro()
{
char* szText[] =
{
"MUSIC:",
"JONATHAN DANIEL",
" ",
"3D SHIP:",
"MAX SHELEKHOV",
" ",
"CODE:",
"VANDER NUNES",
" ",
"IMERSIVA.COM"
};
//
// initialize intro
//
if (m_dwFrame == 0)
{
if (m_kCLEAR || m_kSELECT) return;
// load intro music
m_pMusIntro = new CMusic(m_pEngine);
m_pMusIntro->LoadFromVfs("game.dat", "jdtechno.mid");
// load intro resources
m_pScene = new CSceneGraph(m_pEngine);
m_pScene->LoadModel("plane.mob", 1.5f, 1.25f, 1.0f);
m_pScene->LoadTexture("introbkg.tga");
m_pScene->LoadModel("spaceship2.mob", 0.1f, 0.1f, 0.1f);
m_pScene->LoadTexture("spaceship2a.tga");
m_pTiles[0] = new CSceneItem(m_pScene, 0, 0);
m_pScene->AddItem(m_pScene->Root(), m_pTiles[0]);
m_pPlayer = new CSceneItem(m_pScene, 1, 1);
m_pScene->AddItem(m_pScene->Root(), m_pPlayer);
m_pTiles[0]->TranslateTo(0,0,ITOX(-25));
m_pPlayer->TranslateTo(0,0,0);
m_pPlayer->RotateTo(ITOX(20),ITOX(160),0);
m_pPlayer->UpdateDirection();
m_pCam->RotateTo(0,0,0);
m_pCam->UpdateDirection();
m_pCam->TranslateTo(0,0,ITOX(40));
// start music
m_pMusIntro->Play(true);
m_iIntroTextIdx = 0;
m_jLevel = 1;
m_dwFrame = 1;
}
//
// render a frame
//
if (m_dwFrame)
{
// user select a previous level to start game
if (m_kLEFT)
{
if (!m_klastLEFT)
{
if (m_jLevel > 1) m_jLevel--;
m_klastLEFT = TRUE;
}
} else m_klastLEFT = FALSE;
// select a next level to start game
if (m_kRIGHT)
{
if (!m_klastRIGHT)
{
if (m_jLevel < 6) m_jLevel++;
m_klastRIGHT = TRUE;
}
} else m_klastRIGHT = FALSE;
// scroll up credits text
if (m_kDOWN)
{
//if (!m_klastDOWN)
{
m_iIntroTextIdx+=2;
m_klastDOWN = TRUE;
}
} else m_klastDOWN = FALSE;
// scroll down credits text
if (m_kUP)
{
//if (!m_klastUP)
{
m_iIntroTextIdx-=2;
m_klastUP = TRUE;
}
} else m_klastUP = FALSE;
if (m_kCLEAR)
{
ISHELL_CloseApplet(m_applet.m_pIShell, 0);
return;
}
m_pTiles[0]->TranslateTo(25 * FPsin[(m_dwFrame<<1)%359], 15 * FPcos[m_dwFrame%359], ITOX(-25));
m_pPlayer->AddRotation(0,ITOX(2),0);
m_pPlayer->UpdateDirection();
m_pScene->Render(m_pScene->Root(), m_pCam, FALSE);
m_pSprPressStart->Draw((m_pEngine->ScreenWidth()-m_pSprPressStart->Width())>>1, m_pEngine->ScreenHeight()-m_pSprPressStart->Height()-4);
// show selected level to start...
char szNumber[16];
SPRINTF(szNumber, "%02u", m_jLevel);
m_pSprLevel->Draw(4,4);
m_pSprNumbers->DrawNumber(4,10, szNumber);
for (byte tt=0; tt<10; tt++)
m_pSpr8x13->DrawText32To90((m_pEngine->ScreenWidth()-(8*STRLEN(szText[tt])))>>1,m_pEngine->ScreenHeight()+tt*13-m_iIntroTextIdx, szText[tt]);
m_dwFrame++;
}
//
// start the game
//
if (m_kSELECT)
{
// release intro music (will stop and free memory)
if (m_pMusIntro) { m_pMusIntro->Stop(); DeletePtr(m_pMusIntro); }
// unload all intro resources
CleanUpLevel();
m_dwFrame = 0;
// start game
m_jLifes = 3;
m_dwScore = 0;
m_jGameStatus = STATUS_NEWLEVEL;
}
}
// ----------------------------------------------------------------------------------------------------------
//
// Render a newlevel frame
//
// ----------------------------------------------------------------------------------------------------------
void CGame::RenderNewLevel()
{
CleanUpLevel();
if (LoadLevel("game.dat", m_jLevel))
{
m_pSndLevel->Play();
m_jGameStatus = STATUS_PLAYING;
}
else
m_jGameStatus = STATUS_INTRO;
}
// ----------------------------------------------------------------------------------------------------------
//
// Render dying
//
// ----------------------------------------------------------------------------------------------------------
void CGame::RenderDying()
{
int xx;
m_pPlayer->AddTranslation(0,m_DieImpulse,0);
m_pPlayer->AddRotation(ITOX(16),ITOX(12),ITOX(0));
m_DieImpulse -= DIE_GRAVITY;
if (m_DieImpulse < -128000)
{
// reposition player
VectorCopy(m_PlayerStartPos, m_pPlayer->Position());
m_pPlayer->RotateTo(0,0,0);
m_pPlayer->UpdateDirection();
// reposition enemies
for (xx=0; xx<m_jEnemyCount; xx++)
{
VectorCopy(m_EnemyStartPos[xx], m_pEnemies[xx]->Position());
m_pEnemies[xx]->RotateTo(0,0,0);
m_pEnemies[xx]->UpdateDirection();
}
// clear player and enemies from grid
for (xx=0; xx<GRID_SIZE*GRID_SIZE; xx++)
if (m_pLevelGrid[xx] == 1 || m_pLevelGrid[xx] == 4)
m_pLevelGrid[xx] = 5;
// reposition camera
m_pCam->TranslateTo(m_pPlayer->Position()[0] - m_pPlayer->Direction()[0]*25,ITOX(20), m_pPlayer->Position()[2] + m_pPlayer->Direction()[2]*25);
VectorCopy(m_pPlayer->Rotation(), m_pCam->Rotation());
m_pCam->AddRotation(ITOX(-45), 0, 0);
m_pCam->UpdateDirection();
m_jLifes--;
m_dwFrame = 0;
m_jTurnLeft = m_jTurnRight = 0;
if (m_jLifes > 0)
m_jGameStatus = STATUS_PLAYING;
else
m_jGameStatus = STATUS_GAMEOVER;
return;
}
// -----------------------------------------------------------------------------------------
//
// flags animation
//
// -----------------------------------------------------------------------------------------
for (xx=0; xx<m_jFlagsCount; xx++)
m_pFlags[xx]->AddRotation(0,ITOX(4),0);
// -----------------------------------------------------------------------------------------
//
// render scene
//
// -----------------------------------------------------------------------------------------
m_pScene->Render(m_pScene->Root(), m_pCam);
// -----------------------------------------------------------------------------------------
//
// show some feedback text
//
// -----------------------------------------------------------------------------------------
char szNumber[16];
// remaining flags
SPRINTF(szNumber, "%02u", m_jFlagsLeft);
m_pSprNumbers->DrawNumber(4,m_pEngine->ScreenHeight()-8, szNumber);
// current level
SPRINTF(szNumber, "%02u", m_jLevel);
m_pSprLevel->Draw(4,4);
m_pSprNumbers->DrawNumber(4,10, szNumber);
// current score
SPRINTF(szNumber, "%06u", m_dwScore);
m_pSprScore->Draw(m_pEngine->ScreenWidth()-m_pSprScore->Width()-4,4);
m_pSprNumbers->DrawNumber(m_pEngine->ScreenWidth()-33,10, szNumber);
// lifes
for (xx=1; xx<m_jLifes; xx++)
m_pSprLive->Draw(m_pEngine->ScreenWidth()-(m_pSprLive->Width()+1)*xx-4,m_pEngine->ScreenHeight()-m_pSprLive->Height()-4);
}
// ----------------------------------------------------------------------------------------------------------
//
// Render level upgrading
//
// ----------------------------------------------------------------------------------------------------------
void CGame::RenderPassLevel()
{
m_pPlayer->AddRotation(0,0,0);
m_pPlayer->AddTranslation(PLAYER_MOVE_SPEED*3, ITOX(1), PLAYER_MOVE_SPEED*3);
if (m_pPlayer->Position()[1] > ITOX(30))
{
CleanUpLevel();
m_jLevel++;
m_dwFrame = 0;
m_jGameStatus = STATUS_NEWLEVEL;
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -