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

📄 appstategame.cpp

📁 RGA: Biowaste Game Example This C++ application demonstrates how to create a 2D mobile game for S60
💻 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 + -