?? cengine.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 + -