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

📄 cengine.cpp

📁 JAVA3D游戏
💻 CPP
字号:
    /*
    *
============================================================================
    *  Name     : CEngine.cpp
    *  Part of  : Example3D
    *  Created  : 12/14/2003 by Forum Nokia
    *  Description:
    *     This is the project specification file for Example3D.
    *     Initial content was generated by Series 60 AppWizard.
    *
    *  Version  : 1.0.0
    *  Copyright: Forum Nokia
    *
============================================================================
    */

// INCLUDES
#include "CEngine.h"
#include "CGameTimer.h"
#include "CGame.h"
#include "CPictureLoader.h"
#include "CFpsCounter.h"
#include <eikenv.h>

// CONSTATNS
const TInt KUpdateInterval = 1000000 / 64;	// 64 times per second "Move" update
const TInt KMaxNumUpdates = 10;

// MEMBER FUNCTIONS

CEngine* CEngine::NewL( CWindowGc& aGc, RWindow& aWindow, 
						const TSize& aScreenSize, TDisplayMode aDisplayMode )
	{
	CEngine* self = new( ELeave )CEngine( aGc, aWindow, aScreenSize, aDisplayMode );
	CleanupStack::PushL( self );
	self->ConstructL();
	CleanupStack::Pop( self );
	return self;
	}

CEngine::~CEngine()
	{
	delete iFbsBitmapBuffer;
	delete iTimer;
	delete iGame;
	delete iFps;
	delete iFbsScreenDevice;

	}

void CEngine::ConstructL()
	{
	iPaused = ETrue;
	
	// create screen device for direct screen access
	iFbsScreenDevice = CFbsScreenDevice::NewL( _L(""), iDisplayMode, NULL );

	iFbsBitmapBuffer = new( ELeave )CFbsBitmap();
	iFbsBitmapBuffer->Create( iScreenSize, iDisplayMode );

	iBuffer.iData = iFbsBitmapBuffer->DataAddress();
	iBuffer.iSize = iFbsBitmapBuffer->SizeInPixels();

	iGame = CGame::NewL( iDisplayMode, iBuffer );

	iTimer = CGameTimer::NewL( *this );
	iFps = CFpsCounter::NewL( 2 );

#ifndef __WINS__

        TScreenInfoV01 screenInfo;
	    TPckg<TScreenInfoV01> sInfo(screenInfo);
	    UserSvr::ScreenInfo(sInfo);
         
        TUint16* screenAddr = screenInfo.iScreenAddressValid ? (TUint16*)screenInfo.iScreenAddress : 0;
        User::LeaveIfNull( screenAddr );

        // skip the palette data in the beginning of frame buffer (16 entries in 12bit mode)
        screenAddr += 16;

		iScreen.iData = screenAddr;
		iScreen.iSize = iScreenSize;
#endif

	iTime.HomeTime();

	}

CEngine::CEngine( CWindowGc& aGc, RWindow& aWindow, 
				  const TSize& aScreenSize, TDisplayMode aDisplayMode )
	: iGc( aGc )
	, iWindow( aWindow )
	, iScreenSize( aScreenSize )
	, iDisplayMode( aDisplayMode )
	{

	}



TInt CEngine::DoGameFrameL()
	{
	if( iPaused )
		{
		// stop gametimer
		return EFalse;
		}

	
	// CFbsBitmap data address can change
	iBuffer.iData = iFbsBitmapBuffer->DataAddress();
	iBuffer.iMode = iDisplayMode;


	TTime time;
	time.HomeTime();
	TInt updates = time.MicroSecondsFrom( iTime ).Int64().Low();
	updates /= KUpdateInterval;
	updates -= iUpdates;
	
	iUpdates += updates;
	if( updates < 1 ) updates = 1;
	if( updates > KMaxNumUpdates ) updates = KMaxNumUpdates;
	
	TInt i;
	for( i=0; i<updates; i++ )
		{
		iGame->Move( iKey );
		}

	iGame->Draw( iBuffer );

	iWindow.Invalidate();
	RRegion drawRegion;
	iWindow.GetInvalidRegion( drawRegion );
	iGc.Activate( iWindow );
	iWindow.BeginRedraw( TRect( TPoint( 0,0 ), iScreenSize ) );
	iGc.SetClippingRect( TRect( TPoint( 0,0 ), iScreenSize ) );

	TDrawBuffer drawBuffer = EBitmapCopy;

#ifdef __WINS__
	drawBuffer = EBitmapCopy;
#else
	// check if whole screen is free to draw
	// only then use directly screen memory to draw
	// ( with doublebuffer to prevent display artifacts )
	if( drawRegion.RectangleList()[ 0 ] == TRect( TPoint( 0,0 ), iScreenSize ) )
		{
		drawBuffer = EDoubleBuffered;
		}
#endif

	switch( drawBuffer )
		{
		case EBitmapCopy:
			{
			iGc.BitBlt( TPoint( 0,0 ), iFbsBitmapBuffer );
			break;
			}
		case EDoubleBuffered:
			{
			TInt numPixels = iScreenSize.iWidth * iScreenSize.iHeight;
			Mem::Copy( iScreen.iData, iBuffer.iData, numPixels * 2 );
			break;
			}

		}
	
	iFbsScreenDevice->Update( drawRegion );
	
	// if you are interested in performance
	// here is drawn frames per second value to screen
	iFps->Update();
	const CFont*     fontUsed;
	fontUsed = CEikonEnv::Static()->TitleFont();
	iGc.UseFont(fontUsed);
	TBuf<15> fps;
	fps.Num( iFps->Fps() );
	iGc.SetPenColor( TRgb( 255,255,255 ) );
	iGc.DrawText( fps,TPoint( 20, 20 ) );

	iWindow.EndRedraw();
	iGc.Deactivate();
	

	// RRegion leaks memory if Clear isn't called
	drawRegion.Clear();

	if( iPaused )
		{
		// stop gametimer
		return EFalse;
		}

	// continue gametimer
	return ETrue;
	}


void CEngine::KeyEvent( const TKeyEvent& aKeyEvent,TEventCode aType )
	{
	switch( aType )
		{
		case EEventKeyDown:
			{
			iKey[ aKeyEvent.iScanCode ] = 1;
			break;
			}
		case EEventKeyUp:
			{
			iKey[ aKeyEvent.iScanCode ] = 0;
			break;
			}
		}
	}


void CEngine::Start()
	{
	if( !iPaused ) return;
	iPaused = EFalse;
	iTimer->Start();
	}


void CEngine::Stop()
	{
	if( iPaused ) return;
	iPaused = ETrue;
	iTimer->Cancel();
	}



⌨️ 快捷键说明

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