📄 appstategame.cpp
字号:
#include "AppStateGame.h"
#include "AppStateHelpScreen.h"
#include "AppStateSettingsScreen.h"
#include "ExampleApplication.h"
CAppStateGame::CAppStateGame(CExampleApplication& aApp)
: CAppState(aApp),
iNextState(EAppUpdateStateContinue)
{
}
CAppStateGame::~CAppStateGame()
{
if (iExtraScreen)
{
delete iExtraScreen;
iExtraScreen = NULL;
}
if (iPauseMenu)
{
delete iPauseMenu;
iPauseMenu = NULL;
}
if (iLevel)
{
delete iLevel;
iLevel = NULL;
}
if (iLevelFileDir)
{
delete iLevelFileDir;
iLevelFileDir = NULL;
}
}
TInt CAppStateGame::Init()
{
// get all level files
RFs fs;
TFileName levelpath;
App().BuildFilepath(KPathLevelsSearch, levelpath);
fs.Connect();
fs.GetDir(levelpath, 0, ESortByName, iLevelFileDir);
fs.Close();
if (iLevelFileDir == NULL)
{
return KErrNotFound;
}
if (iLevelFileDir->Count() == 0)
{
delete iLevelFileDir;
iLevelFileDir = NULL;
return KErrNotFound;
}
// load first level
return LoadNextLevel();
}
TInt CAppStateGame::LoadNextLevel()
{
if (iCurrentLevelIndex >= iLevelFileDir->Count())
{
// no more levels to load...
return KErrNotFound;
}
TFileName levelname;
levelname = KPathLevels;
levelname += (*iLevelFileDir)[iCurrentLevelIndex].iName;
TFileName levelpath;
App().BuildFilepath(levelname, levelpath);
iLevel = new (ELeave) CLevel( App() );
return iLevel->Init(levelpath, iTotalMoney);
}
EAppUpdateState CAppStateGame::Update(const TReal64& aFrametime)
{
EAppUpdateState state = EAppUpdateStateContinue;
if (iExtraScreen)
{
EAppUpdateState state = iExtraScreen->Update(aFrametime);
if (state != EAppUpdateStateContinue)
{
delete iExtraScreen;
iExtraScreen = NULL;
}
}
else if (iPauseMenu)
{
iPauseMenu->Update(aFrametime);
}
else if (iLevel)
{
state = iLevel->Update(aFrametime);
if (state == EAppUpdateStateInitMenu ||
state == EAppUpdateStateInitNewHighScore)
{
return state;
}
if (state == EAppUpdateStateInitGame)
{
// level is complete, init next level
iTotalMoney += iLevel->RemainingMoney();
if (++iCurrentLevelIndex >= iLevelFileDir->Count())
{
// no more levels to init, all levels are thru
App().StopAudio(KAudioFileMove);
App().StopAudio(KAudioFileWater1);
// check if player got new high score
CHighScores* scores = App().HighScores();
THighScoreItem item;
item.iScore = iTotalMoney;
if (scores->Add(item, EFalse) >= 0)
{
// new high score archieved
App().SetLastGameScore(iTotalMoney);
return EAppUpdateStateInitNewHighScore;
}
else
{
return EAppUpdateStateInitMenu;
}
}
else
{
// delete level and init next one
delete iLevel;
iLevel = NULL;
LoadNextLevel();
}
}
}
return iNextState;
}
void CAppStateGame::Draw(IGraphicsContext& aContext)
{
if (iLevel)
{
iLevel->Draw(aContext);
}
if (iExtraScreen)
{
iExtraScreen->Draw(aContext);
}
else if (iPauseMenu)
{
App().BlendRect(TRect(0, 0, App().BackBufferSize().iWidth, App().BackBufferSize().iHeight));
iPauseMenu->Draw(aContext);
}
}
TInt CAppStateGame::InitPauseMenu()
{
// create new menu object
TInt error;
iPauseMenu = new (ELeave) CGameMenu( App() );
error = iPauseMenu->Init();
if (error != KErrNone)
{
return error;
}
// add menu items
TMenuItem item;
item.iID = KMenuIdContinue;
item.iText = KTextMenuContinue;
iPauseMenu->AddMenuItem(item);
item.iID = KMenuIdSettings;
item.iText = KTextMenuSettings;
iPauseMenu->AddMenuItem(item);
item.iID = KMenuIdHelp;
item.iText = KTextMenuHelp;
iPauseMenu->AddMenuItem(item);
item.iID = KMenuIdExit;
item.iText = KTextMenuExit;
iPauseMenu->AddMenuItem(item);
TSize bbsize = App().BackBufferSize();
TPoint menupos;
menupos.iX = (bbsize.iWidth >> 1) - (iPauseMenu->Size().iWidth >> 1);
menupos.iY = (bbsize.iHeight >> 1) - (iPauseMenu->Size().iHeight >> 1);
iPauseMenu->SetPosition(menupos);
App().StopAudio(KAudioFileMove);
App().StopAudio(KAudioFileWater1);
return KErrNone;
}
void CAppStateGame::KeyDown(TUint32 aKeyCode)
{
if (iExtraScreen)
{
iExtraScreen->KeyDown(aKeyCode);
}
else
{
if (iPauseMenu)
{
iPauseMenu->KeyDown(aKeyCode);
}
if ( aKeyCode == INPUT_KEY_LSK ||
aKeyCode == INPUT_KEY_RSK ||
aKeyCode == INPUT_KEY_OK)
{
if (!iPauseMenu)
{
InitPauseMenu();
}
else
{
// menu selection keys
// menu item selected
switch (iPauseMenu->SelectedMenuItemId())
{
case KMenuIdContinue:
delete iPauseMenu;
iPauseMenu = NULL;
App().SetAudioVolume(KAudioFileWater1, 0);
App().SetAudioVolume(KAudioFileMove, 0);
App().PlayAudio(KAudioFileMove, ETrue);
App().PlayAudio(KAudioFileWater1, ETrue);
break;
case KMenuIdSettings:
iExtraScreen = new CAppStateSettingsScreen(App());
iExtraScreen->Init();
break;
case KMenuIdHelp:
iExtraScreen = new CAppStateHelpScreen(App());
iExtraScreen->Init();
break;
case KMenuIdExit:
iNextState = EAppUpdateStateInitMenu;
break;
}
}
}
if (iLevel)
{
iLevel->KeyDown(aKeyCode);
}
}
}
void CAppStateGame::Pause()
{
if (!iPauseMenu)
{
InitPauseMenu();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -