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

📄 game.cpp

📁 C++台球游戏代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
#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 + -