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

📄 exampleapplication.cpp

📁 RGA: Biowaste Game Example This C++ application demonstrates how to create a 2D mobile game for S60
💻 CPP
📖 第 1 页 / 共 2 页
字号:


#include "ExampleApplication.h"

// include application states
#include "AppStateMenu.h"
#include "AppStateGame.h"
#include "AppStateIntro.h"
#include "AppStateNewHighScore.h"



CExampleApplication::CExampleApplication()
	{
	// init audio buffers to NULL
	TInt i;
	for (i=0; i<KAudioNumFiles; i++)
		{
        iAudioData[i] = NULL;
       	iAudioSound[i] = NULL;
		}
	
	iRepository = CRepository::NewL( KCRUidProfileEngine );
	}


CExampleApplication::~CExampleApplication()
	{
	}


TInt CExampleApplication::OnInitialize()
	{
	TInt error = KErrNone;

	// create game fonts
	TFontSpec fs( _L("System"), 120 );
	fs.iFontStyle.SetStrokeWeight( EStrokeWeightBold );
	fs.iFontStyle.SetBitmapType(EAntiAliasedGlyphBitmap);
	iWsScreen->GetNearestFontToDesignHeightInTwips(iNormalFont, fs);

	TFontSpec fs2( _L("System"), 180 );
	fs2.iFontStyle.SetStrokeWeight( EStrokeWeightBold );
	fs2.iFontStyle.SetBitmapType(EAntiAliasedGlyphBitmap);
	iWsScreen->GetNearestFontToDesignHeightInTwips(iBigFont, fs2);
	
	TFontSpec fs3( _L("System"), 120 );
	fs3.iFontStyle.SetBitmapType(EAntiAliasedGlyphBitmap);
	iWsScreen->GetNearestFontToDesignHeightInTwips(iSmallFont, fs3);
	
	
	// init & load high scores table
	TFileName fn;
	BuildFilepath(KFilenameHighScores, fn);
	#ifdef __WINS__
	fn = _L("c:\\scores.dat");
	#endif
	
	iHighScores = CHighScores::NewL(fn, 10);
	iHighScores->Load();
	
	// init & load settings
	BuildFilepath(KFilenameSettings, fn);
	#ifdef __WINS__
	fn = _L("c:\\settings.dat");
	#endif
	
	iSettings = CSettings::NewL(fn);
	iSettings->Load();

	
	// create buffer for info area
	error = CreateBitmapAndContext(	TSize(BackBufferSize().iWidth, 32),
									iInfoAreaBuffer,
									iInfoAreaBufferContext);
	if (error != KErrNone)
		{
		return error;
		}
	
	
	// initialise the application state
	//iLastGameScore = 1000.0;
	//error = ChangeAppStateL(EAppUpdateStateInitNewHighScore);
	error = ChangeAppStateL(EAppUpdateStateInitIntro);
	if (error != KErrNone)
		{
		return error;
		}
	
	return KErrNone;
	}


TInt CExampleApplication::InitResources()
	{
	// load game graphics
	TInt error = LoadGraphicsL();
	if (error != KErrNone)
		{
		return error;
		}
	
	// init audio
	error = InitAudio();
	if (error != KErrNone)
		{
		return error;
		}
	
	return KErrNone;
	}


TInt CExampleApplication::LoadGraphicsL()
	{
	TInt i;
	TInt errors[KNumBitmaps];
	
	// make room into the bitmap and mask array
	for (i=0; i<KNumBitmaps; i++)
		{
		iBitmaps.Append(NULL);
		iMasks.Append(NULL);
		}
	
	// load all graphics
	i = 0;
	errors[i++] = LoadBitmapAndMask(KBitmapBlock0, _L("blocks\\0.jpg"), 0);
	errors[i++] = LoadBitmapAndMask(KBitmapBlock1, _L("blocks\\1.jpg"), 0);
	errors[i++] = LoadBitmapAndMask(KBitmapBlock2, _L("blocks\\2.jpg"), 0);
	errors[i++] = LoadBitmapAndMask(KBitmapBlock2_Frame2, _L("blocks\\2_2.jpg"), 0);
	errors[i++] = LoadBitmapAndMask(KBitmapBlock2_Frame3, _L("blocks\\2_3.jpg"), 0);
	errors[i++] = LoadBitmapAndMask(KBitmapBlock2_Frame4, _L("blocks\\2_4.jpg"), 0);

	errors[i++] = LoadBitmapAndMask(KBitmapBonusMoney, _L("gameplay\\bonus01.png"), 0);
	errors[i++] = LoadBitmapAndMask(KBitmapBonusPower, _L("gameplay\\bonus02.png"), 0);
	errors[i++] = LoadBitmapAndMask(KBitmapBonusWater, _L("gameplay\\bonus03.png"), 0);
	errors[i++] = LoadBitmapAndMask(KBitmapGhostRed, _L("gameplay\\ghost01.png"), 0);
	errors[i++] = LoadBitmapAndMask(KBitmapGhostGreen, _L("gameplay\\ghost02.png"), 0);
	errors[i++] = LoadBitmapAndMask(KBitmapGhostBlue, _L("gameplay\\ghost03.png"), 0);
	errors[i++] = LoadBitmapAndMask(KBitmapPlayer, _L("gameplay\\player.png"), 8);

	errors[i++] = LoadBitmapAndMask(KBitmapBuildingTop, _L("mapitems\\buildingtop.jpg"), 0);
	errors[i++] = LoadBitmapAndMask(KBitmapBuildingWall, _L("mapitems\\buildingwall.jpg"), 0);
	errors[i++] = LoadBitmapAndMask(KBitmapGrass1, _L("mapitems\\bush01.png"), 0);
	errors[i++] = LoadBitmapAndMask(KBitmapGrass2, _L("mapitems\\bush02.png"), 0);
	errors[i++] = LoadBitmapAndMask(KBitmapGrass3, _L("mapitems\\bush03.png"), 0);
	errors[i++] = LoadBitmapAndMask(KBitmapGrass4, _L("mapitems\\bush04.png"), 0);
	errors[i++] = LoadBitmapAndMask(KBitmapTree1, _L("mapitems\\tree01.png"), 8);
	errors[i++] = LoadBitmapAndMask(KBitmapTree2, _L("mapitems\\tree02.png"), 8);

	errors[i++] = LoadBitmapAndMask(KBitmapMessage, _L("misc\\message.jpg"), 0);
	errors[i++] = LoadBitmapAndMask(KBitmapPhone, _L("misc\\phone.jpg"), 0);
	
	// check if any of the loadings failed
	for (i=0; i<KNumBitmaps; i++)
		{
		if (errors[i] != KErrNone)
			{
			return errors[i];
			}
		}
	
	return KErrNone;
	}


TInt CExampleApplication::LoadBitmapAndMask(TUint aId, const TDesC& aFilename, TInt aAlphaBits)
	{
	TFileName filename;
	BuildFilepath(aFilename, filename);
	
	// create & load the bitmap
	TInt error;
	ReturnCode ret;
	IBitmap* bitmap = NULL;
	ret = CRuntime::CreateInstance( bitmap );
	if ( ret != OK )
		{
		return RGAErrorToSymbianError(ret);
		}
	
	ret = bitmap->Reconfigure(CSize(1, 1), BackBuffer().GetColorFormat());
	if ( ret != OK )
		{
		bitmap->Release();
		return RGAErrorToSymbianError(ret);
		}
	
	error = LoadImage(*bitmap, filename, ETrue);
	if (error != KErrNone)
		{
		bitmap->Release();
		return error;
		}
	
	iBitmaps[aId] = bitmap;
	
	// load mask
	IBitmap* mask = NULL;
	
	if (aAlphaBits > 0)
		{
		ret = CRuntime::CreateInstance( mask );
		if ( ret != OK )
			{
			return RGAErrorToSymbianError(ret);
			}
	
		TBuf<16> extension = filename.Right(4);
		TBuf<32> replacewith = _L("_mask");
		replacewith += extension;
		filename.Replace(filename.Find(extension), 4, replacewith);
		
		if (aAlphaBits == 1)
			{
			mask->Reconfigure(bitmap->GetSize(), GRAPHICS_FORMAT_MONO);
			}
		else
			{
			mask->Reconfigure(bitmap->GetSize(), GRAPHICS_FORMAT_GRAY256);
			}
		
		error = LoadImage(*mask, filename, ETrue);
		if (error != KErrNone)
			{
			mask->Release();
			mask = NULL;
			}
		}
	
	iMasks[aId] = mask;
	
	return KErrNone;
	}


TInt CExampleApplication::InitAudio()
	{
	// init audio mixer
	ReturnCode ret;
	ret = CRuntime::CreateInstance( iAudioMixer );
	if (ret != OK)
		{
		return RGAErrorToSymbianError(ret);
		}

	// set mixing parameters
    CAudioMixerCapabilities caps;
    caps.mOutputSampleRates = AUDIO_SAMPLERATE_16000;
    caps.mOutputEncodings = AUDIO_ENCODING_16BIT;
    caps.mOutputChannels = AUDIO_CHANNEL_STEREO;
    ret = iAudioMixer->SetConfiguration( caps );
    if (ret != OK)
    	{
    	iAudioMixer->Release();
    	iAudioMixer = NULL;
        return RGAErrorToSymbianError(ret);
    	}

    TUint32 mixingbuffersize = 3200;
    iAudioMixer->SetOutputBufferSize(mixingbuffersize);
    iAudioMixer->Start(this);
	
	return KErrNone;
	}


void CExampleApplication::PlayAudio(TInt aIndex, TBool aLoop)
	{
	// game sounds are on
	IAudioSound* sound = iAudioSound[aIndex];
	if (sound && iAudioEnabled && iSettings->iVolume)
		{
		sound->Play();
		if (aLoop)
			{
			sound->LoopComplete();
			}
		}
	}


void CExampleApplication::RePlayAudio(TInt aIndex)
	{
	IAudioSound* sound = iAudioSound[aIndex];
	if (sound && iAudioEnabled && iSettings->iVolume)
		{
		sound->SetPositionByTime(0);
		sound->Play();
		}
	}

void CExampleApplication::StopAudio(TInt aIndex)
	{
	IAudioSound* sound = iAudioSound[aIndex];
	if (sound)
		{
		sound->Pause();
		}
	}

void CExampleApplication::SetAudioVolume(TInt aIndex, TInt aVolume)
	{
	IAudioSound* sound = iAudioSound[aIndex];
	if (sound)
		{
		sound->SetVolume(aVolume);
		}
	}


void CExampleApplication::SetMasterVolume(TInt aVolume)
	{
	iSettings->iVolume = aVolume;
	
	TInt i;
	for (i=0; i<KAudioNumFiles; i++)
		{
		SetAudioVolume(i, aVolume);
		}
	}


TInt CExampleApplication::MasterVolume() const
	{
	return iSettings->iVolume;
	}

TBool CExampleApplication::AudioEnabled() const
	{
	return iAudioEnabled;
	}



// functions from IAudioObjectObserver
void CExampleApplication::HandleAudioObjectStatus(	IAudioObject& /*aAudioObject*/,
													const AudioObjectStatus /*aStatus*/,
													const uint32 /*aLoopCount*/ ) NO_THROW
{
        
}

void CExampleApplication::InitializeComplete(	IAudioObject& aAudioObject,
												ReturnCode aReturnCode ) NO_THROW
	{
	if (&aAudioObject == iAudioMixer && aReturnCode == OK)
		{
		// load audio files
		ReturnCode ret;
		TInt i;
		TBuf<256> tmp;
		for (i=0; i<KAudioNumFiles; i++)
			{
			// build wave filename
			TFileName fn;
			tmp = (TUint16*)KAudioFilenames[i];
			BuildFilepath(tmp, fn);
			fn.ZeroTerminate();
			
			
			ret = iAudioMixer->CreateAudioData(	iAudioData[i],
	    		   								(const char16*)fn.Ptr(),
	    		   								FALSE );
	
	       if (ret == OK)
	    	   {
	    	   ret = iAudioData[i]->CreateSound(iAudioSound[i]);
	    	   }
	       
	       if (ret != OK)
	    	   {
	    	   if (iAudioData[i])
	       			{
	       			iAudioData[i]->Release();
	       			iAudioData[i] = NULL;
	       			}
	    	   iAudioSound[i] = NULL;
	    	   }
	       else
	    	   {
	    	   iAudioSound[i]->SetVolume(10);
	    	   }
			}
		}
	}




void CExampleApplication::OnClose()
	{
	TInt i;

	if (iRepository)
		{
		delete iRepository;
		iRepository = NULL;
		}
	
	if (iSettings)
		{
		// save & delete settings
		iSettings->Save();
		delete iSettings;
		iSettings = NULL;
		}
	
	if (iHighScores)
		{
		// save & delete high scores table
		iHighScores->Save();
		delete iHighScores;
		iHighScores = NULL;
		}
	
	// release application state
	if (iState)
		{
		delete iState;
		iState = NULL;
		}
	
	// release audio files
	for (i=0; i<KAudioNumFiles; i++)
		{
        if (iAudioData[i])
        	{
        	iAudioData[i]->Release();
        	iAudioData[i] = NULL;
        	}
        
        if (iAudioSound[i])
        	{

⌨️ 快捷键说明

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