#include "Game.h"
CGame::CGame()
{
m_pD3D=NULL;
m_pD3DDevice=NULL;
m_pDirectInput=NULL;
m_pKeyboard=NULL;
m_pMouse=NULL;
m_pFont=NULL;
m_pTableMesh=NULL;
m_pMesh=NULL;
m_pCue=NULL;
int i;
for(i=0;i<SUMBALL;i++)
m_pSphere[i]=NULL;
m_dwFrames=0;
m_dwFPS=65;
m_dwPedotime=15;
m_dwCountFrames=0;
m_dwStartTime=0;
m_dwEndTime=0;
m_dwOldTime=0;
m_dwNewTime=0;
m_dwTotalPolygons=0;
m_iMouseX=0;
m_iMouseY=0;
m_iScreenHeight=0;
m_iScreenWidth=0;
m_bQuit=FALSE;
//***************************************
//**************For Camera***************
m_vecCameraPosition.x=75.0f;
m_vecCameraPosition.y=20.0f;
m_vecCameraPosition.z=0.0f;
m_vecSavedCameraPosition.x=0.0f;
m_vecSavedCameraPosition.y=0.0f;
m_vecSavedCameraPosition.z=0.0f;
m_vecSavedLookAtPosition.x=0.0f;
m_vecSavedLookAtPosition.y=0.0f;
m_vecSavedLookAtPosition.z=0.0f;
m_iMouseStateX=0;
m_iMouseStateY=0;
//***************************************
//***************************************
m_fSysEnergy=0.0f;
m_vecCuePosition.x=0.0f;
m_vecCuePosition.y=0.0f;
m_vecCuePosition.z=0.0f;
m_vecCueDir.x=0.0f;
m_vecCueDir.y=0.0f;
m_vecCueDir.z=0.0f;
m_bCtrl=FALSE;
m_bSendBall=FALSE;
m_iMoveCue=0;
m_fScale=1.0f;
m_fScaleTemp=1.0f;
m_iMouseRight=0;
m_fCueVelocity=0.0f;
m_bPlanform=FALSE;
//*********************************************************************
//********************Code for SphereHitBarProcess()*******************
//*********************************************************************
m_vecRayPos.x=0.0f;
m_vecRayPos.y=0.0f;
m_vecRayPos.z=0.0f;
m_vecRayPos2.x=0.0f;
m_vecRayPos2.y=0.0f;
m_vecRayPos2.z=0.0f;
//For Z-axis proitive
m_vecRayDir[0].x=0.0f;
m_vecRayDir[0].y=0.0f;
m_vecRayDir[0].z=1.0f;
//For X-axis negative
m_vecRayDir[1].x=-1.0f;
m_vecRayDir[1].y=0.0f;
m_vecRayDir[1].z=0.0f;
//For Z-axis negative
m_vecRayDir[2].x=0.0f;
m_vecRayDir[2].y=0.0f;
m_vecRayDir[2].z=-1.0f;
//For X-axis proitive
m_vecRayDir[3].x=1.0f;
m_vecRayDir[3].y=0.0f;
m_vecRayDir[3].z=0.0f;
//For 45 degree
m_vecRayDir[4].x=1.0f;
m_vecRayDir[4].y=0.0f;
m_vecRayDir[4].z=1.0f;
D3DXVec3Normalize(&m_vecRayDir[4],&m_vecRayDir[4]);
//For 135 degree
m_vecRayDir[5].x=-1.0f;
m_vecRayDir[5].y=0.0f;
m_vecRayDir[5].z=1.0f;
D3DXVec3Normalize(&m_vecRayDir[5],&m_vecRayDir[5]);
//For 225 degree
m_vecRayDir[6].x=-1.0f;
m_vecRayDir[6].y=0.0f;
m_vecRayDir[6].z=-1.0f;
D3DXVec3Normalize(&m_vecRayDir[6],&m_vecRayDir[6]);
//For 315 degree
m_vecRayDir[7].x=1.0f;
m_vecRayDir[7].y=0.0f;
m_vecRayDir[7].z=-1.0f;
D3DXVec3Normalize(&m_vecRayDir[7],&m_vecRayDir[7]);
/* //For 15 degree
m_vecRayDir[8].x=1.0f;
m_vecRayDir[8].y=0.0f;
m_vecRayDir[8].z=0.2679f;
D3DXVec3Normalize(&m_vecRayDir[8],&m_vecRayDir[8]);
//For 165 degree
m_vecRayDir[9].x=-1.0f;
m_vecRayDir[9].y=0.0f;
m_vecRayDir[9].z=0.2679f;
D3DXVec3Normalize(&m_vecRayDir[9],&m_vecRayDir[9]);
//For 195 degree
m_vecRayDir[10].x=-1.0f;
m_vecRayDir[10].y=0.0f;
m_vecRayDir[10].z=-0.2679f;
D3DXVec3Normalize(&m_vecRayDir[10],&m_vecRayDir[10]);
//For 345 degree
m_vecRayDir[11].x=1.0f;
m_vecRayDir[11].y=0.0f;
m_vecRayDir[11].z=-0.2679f;
*/
/* //For Z-axis proitive
m_vecRayDir[0].x=0.0f;
m_vecRayDir[0].y=0.0f;
m_vecRayDir[0].z=1.0f;
//For X-axis negative
m_vecRayDir[1].x=-1.0f;
m_vecRayDir[1].y=0.0f;
m_vecRayDir[1].z=0.0f;
//For Z-axis negative
m_vecRayDir[2].x=0.0f;
m_vecRayDir[2].y=0.0f;
m_vecRayDir[2].z=-1.0f;
//For X-axis proitive
m_vecRayDir[3].x=1.0f;
m_vecRayDir[3].y=0.0f;
m_vecRayDir[3].z=0.0f;
for(i=4;i<DIRECTION_SEGMENTS;i++)
{
if(i*PEDOMETER > 0 && i*PEDOMETER < 90)
{
m_vecRayDir[i].x=1.0f;
m_vecRayDir[i].y=0.0f;
m_vecRayDir[i].z=fabsf(tanf((float)i*PEDOMETER));
continue;
}
if(i*PEDOMETER > 90 && i*PEDOMETER < 180)
{
m_vecRayDir[i].x=-1.0f;
m_vecRayDir[i].y=0.0f;
m_vecRayDir[i].z=fabsf(tanf((float)i*PEDOMETER));
continue;
}
if(i*PEDOMETER > 180 && i*PEDOMETER < 270)
{
m_vecRayDir[i].x=-1.0f;
m_vecRayDir[i].y=0.0f;
m_vecRayDir[i].z=-fabsf(tanf((float)i*PEDOMETER));
continue;
}
if(i*PEDOMETER > 270 && i*PEDOMETER < 360)
{
m_vecRayDir[i].x=1.0f;
m_vecRayDir[i].y=0.0f;
m_vecRayDir[i].z=-fabsf(tanf((float)i*PEDOMETER));
continue;
}
}
for(i=4;i<DIRECTION_SEGMENTS;i++)
D3DXVec3Normalize(&m_vecRayDir[i],&m_vecRayDir[i]);
*/
//For Y-axis negative
m_vecRayDir[8].x=0.0f;
m_vecRayDir[8].y=-1.0f;
m_vecRayDir[8].z=0.0f;
m_bHitBar=FALSE;
m_fDistance=0.0f;
//*********************************************************************
//*********************************************************************
//****************************For Sound********************************
//*********************************************************************
m_pSoundHitCue0=NULL;
m_pSoundHitCue1=NULL;
m_pSoundHitBar=NULL;
m_pSoundBimpacting0=NULL;
m_pSoundBimpacting1=NULL;
m_pSoundFallInHole=NULL;
m_bSoundCardState=FALSE;
//*********************************************************************
//*********************************************************************
}
CGame::~CGame()
{
LogInfo("<br>Finsih Game:");
//Clean up object and interfaces
CleanUpGame();
if(m_bSoundCardState)
{
CleanUpDirectAudio();
CoUninitialize();
}
CleanUpDirectInput();
CleanUpDirect3D();
CoUninitialize();
//m_pMesh can't use SafeRelease macro because Mesh Pointer has been Release in ~Table().
//m_pMesh can't use SafeDelete macro because it never "new" object.
//so.......
m_pMesh=NULL;
//save statistics to log
DWORD dwDuration=(m_dwEndTime-m_dwStartTime)/1000;
if((dwDuration!=0)&&(m_dwFrames!=0))
{
//Log states
LogInfo("<br>Statistics:");
LogInfo("<li>Start Time (ms): %d",m_dwStartTime);
LogInfo("<li>End Time (ms): %d",m_dwEndTime);
LogInfo("<li>Duration (s): %d",dwDuration);
LogInfo("<li>Total Frame Count: %d",m_dwFrames);
LogInfo("<li>Average FPS: %d",(m_dwFrames/dwDuration));
LogInfo("<li>Total Polygons: %d",m_dwTotalPolygons);
LogInfo("<li>Average Polygons per Frame: %d",(m_dwTotalPolygons/m_dwFrames));
}
else
{
LogInfo("<br>No statistics to report");
}
StopLogging();
}
D3DFORMAT CGame::CheckDisplayMode(UINT nWidth,UINT nHeight,UINT nDepth)
{
UINT x;
D3DDISPLAYMODE d3ddm;
for(x=0;x<m_pD3D->GetAdapterModeCount(0);x++)
{
m_pD3D->EnumAdapterModes(D3DADAPTER_DEFAULT,x,&d3ddm);
if(d3ddm.Width==nWidth)
{
if(d3ddm.Height==nHeight)
{
if((d3ddm.Format==D3DFMT_R5G6B5) ||
(d3ddm.Format==D3DFMT_X1R5G5B5) ||
(d3ddm.Format==D3DFMT_X4R4G4B4))
{
if(nDepth==16)
{
return d3ddm.Format;
}
}
else if((d3ddm.Format==D3DFMT_R8G8B8) ||
(d3ddm.Format==D3DFMT_X8R8G8B8))
{
if(nDepth==32)
{
return d3ddm.Format;
}
}
}
}
}
return D3DFMT_UNKNOWN;
}
BOOL CGame::InitializeD3D(HWND hwnd,UINT nWidth,UINT nHeight)
{
LogInfo("<br>Initialize Direct3D:");
m_pD3D=Direct3DCreate8(D3D_SDK_VERSION);
if(m_pD3D==NULL)
{
LogError("<li>Unable to create DirectX8 interface.");
return FALSE;
}
//Get the curren display mode
D3DDISPLAYMODE d3ddm;
d3ddm.Format=CheckDisplayMode(nWidth,nHeight,32);
if(d3ddm.Format!=D3DFMT_UNKNOWN)
{
d3ddm.Width=nWidth;
d3ddm.Height=nHeight;
LogInfo("<li>%d x %d x 32bit back buffer format selected. Format = %d.",nWidth,nHeight,d3ddm.Format);
}
else
{
d3ddm.Format=CheckDisplayMode(nWidth,nHeight,16);
if(d3ddm.Format!=D3DFMT_UNKNOWN)
{
d3ddm.Width=nWidth;
d3ddm.Height=nHeight;
LogInfo("<li>%d x %d x 16bit back buffer format selected. For
评论0