📄 game.cpp
字号:
#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. Format = %d.",nWidth,nHeight,d3ddm.Format);
}
else
{
LogError("<li>Unable to select back buffer format for %d x %d.",nWidth,nHeight);
return FALSE;
}
}
//Create a structure to hold the setting for device
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed=FALSE;
d3dpp.BackBufferCount=1;
d3dpp.BackBufferFormat=d3ddm.Format;
d3dpp.BackBufferWidth=d3ddm.Width;
d3dpp.BackBufferHeight=d3ddm.Height;
d3dpp.hDeviceWindow=hwnd;
d3dpp.SwapEffect=D3DSWAPEFFECT_COPY_VSYNC;
d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;
d3dpp.FullScreen_PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;
m_iScreenWidth=d3ddm.Width;
m_iScreenHeight=d3ddm.Height;
//Select depth buffer
if(m_pD3D->CheckDeviceFormat(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,d3ddm.Format,
D3DUSAGE_DEPTHSTENCIL,D3DRTYPE_SURFACE,D3DFMT_D24S8)==D3D_OK)
{
d3dpp.AutoDepthStencilFormat=D3DFMT_D24S8;
d3dpp.EnableAutoDepthStencil=TRUE;
LogInfo("<li>32bit depth Stencil buffer selected.24 for depth_buffer,8 for stencil_buffer.");
}
else if(m_pD3D->CheckDeviceFormat(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,d3ddm.Format,
D3DUSAGE_DEPTHSTENCIL,D3DRTYPE_SURFACE,D3DFMT_D24X8)==D3D_OK)
{
d3dpp.AutoDepthStencilFormat=D3DFMT_D24X8;
d3dpp.EnableAutoDepthStencil=TRUE;
LogInfo("<li>24bit depth Stencil buffer selected");
}
else if(m_pD3D->CheckDeviceFormat(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,d3ddm.Format,
D3DUSAGE_DEPTHSTENCIL,D3DRTYPE_SURFACE,D3DFMT_D16)==D3D_OK)
{
d3dpp.AutoDepthStencilFormat=D3DFMT_D16;
d3dpp.EnableAutoDepthStencil=TRUE;
LogInfo("<li>16bit depth Stencil buffer selected");
}
else
{
d3dpp.EnableAutoDepthStencil=FALSE;
LogError("<li>Unable to select Stencil depth buffer.");
}
//Create a Direct3D device
if(FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,&m_pD3DDevice)))
{
LogError("<li>Unable to create device.");
return FALSE;
}
//Turn on back face culling.
if(FAILED(m_pD3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW)))
{
LogError("<li>SetRenderState: D3DRS_CULLMODE Failed");
return FALSE;
}
else
{
LogInfo("<li>SetRenderState: D3DRS_CULLMODE OK");
}
//Turn on Depth Buffering
if(FAILED(m_pD3DDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE)))
{
LogError("<li>SetRenderState: D3DRS_ZENABLE Failed");
return FALSE;
}
else
{
LogInfo("<li>SetRenderState: D3DRS_ZENABLE OK");
}
//Set fill state.Possible value:D3DFILL_POINT,D3DFILL_WIREFRAME,D3DFILL_SOLID
if(FAILED(m_pD3DDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID)))
{
LogError("<li>SetRenderState: D3DRS_FILLMODE Failed");
return FALSE;
}
else
{
LogInfo("<li>SetRenderState: D3DRS_FILLMODE OK");
}
//Set the D3DRS_NORMALIZENORMALS render state to fix the
//problem when scaling the object get darker
if(FAILED(m_pD3DDevice->SetRenderState(D3DRS_NORMALIZENORMALS,TRUE)))
{
LogError("<li>SetRenderState: D3DRS_NORMALIZENORMALS Failed");
return FALSE;
}
else
{
LogInfo("<li>SetRenderState: D3DRS_NORMALIZENORMALS OK");
}
//Enable alpha blending so we can use transparent textures
if(FAILED(m_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE)))
{
LogError("<li>SetRenderState: D3DRS_ALPHABLENDENABLE Failed");
return FALSE;
}
else
{
//Set how the texture should be blended(use alpha)
m_pD3DDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
m_pD3DDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
LogInfo("<li>SetRenderState: D3DRS_ALPHABLENDENABLE OK");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -