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

📄 cd3dapp.cpp

📁 俄罗斯方块3D 程序+源码俄罗斯方块3D(程序+源码
💻 CPP
字号:
#include "CD3DApp.h"
#include "normal.h"
#include "MsgHelp.h"
#include "3dhelp.h"
#include "CShakingCamera.h"
#include "CSnapshot.h"
#include "CLight.h"
#include "CMaterialManager.h"
#include "CGameRender.h"


extern CShakingCamera		theCamera;
extern CSnapshot	theSnapshot;
extern CLight		theLight;
extern CMaterialManager		theMaterialManager;				//材质管理器
extern CGameRender	theGameRender;


CD3DApp::CD3DApp()
{
	m_pD3D9 = NULL;
	m_pDevice = NULL;
	m_Color = D3DCOLOR_XRGB( 128, 128, 128 );
}

CD3DApp::~CD3DApp()
{

}

/////////////////////////////////////////////////////////////////////
//初始化D3D
/////////////////////////////////////////////////////////////////////
bool CD3DApp::InitD3D( bool IsWindow, HWND hWnd )
{
	HRESULT hr;

	//获取D3D9对象指针:
	m_pD3D9 = Direct3DCreate9( D3D_SDK_VERSION );
	if ( m_pD3D9 == NULL )
	{
		Warn( "DX版本不符请正确安装DX9版本" );
		return false;
	}

	//获取当前显示模式:
	D3DDISPLAYMODE d3dDisplayMode;
	hr = m_pD3D9->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, 
										&d3dDisplayMode );
	if ( FAILED( hr ) )
	{
		Warn( "获取显示模式失败" );
		return false;
	}

	//检测硬件支持
	DWORD vp = 0;
	D3DCAPS9 d3dcaps;
	hr = m_pD3D9->GetDeviceCaps( D3DADAPTER_DEFAULT,
								D3DDEVTYPE_HAL, &d3dcaps );
	if ( FAILED( hr ) )
	{
		Warn( "检测硬件失败" );
		return false;
	}

	if ( d3dcaps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
	{
		vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
	}
	else
	{
		vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
		Warn( "不支持3D加速功能" );
	}
	

	//获取窗口宽高:
	RECT rc;
	GetClientRect( hWnd, &rc );
	
	//填充D3DPRESENT_PARAMETERS
	D3DPRESENT_PARAMETERS m_d3dpp;
	ZeroMemory( &m_d3dpp, sizeof( D3DPRESENT_PARAMETERS ) );
	
	m_d3dpp.BackBufferWidth = rc.right - rc.left;
	m_d3dpp.BackBufferHeight = rc.bottom - rc.top;


	m_d3dpp.BackBufferFormat = d3dDisplayMode.Format;
	m_d3dpp.BackBufferCount = 1;

	m_d3dpp.hDeviceWindow = hWnd;
	m_d3dpp.Windowed = IsWindow;
	m_d3dpp.EnableAutoDepthStencil = TRUE;			//FALSE;
	m_d3dpp.AutoDepthStencilFormat = D3DFMT_D16;	//D3DFMT_UNKNOWN;
	m_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;		//D3DSWAPEFFECT_FLIP
	m_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //D3DPRESENT_INTERVAL_DEFAULT
	hr = m_pD3D9->CreateDevice( D3DADAPTER_DEFAULT,
								D3DDEVTYPE_HAL,
								hWnd,
								vp,
								&m_d3dpp,
								&m_pDevice
								);
	if ( FAILED( hr ) )
	{
		Warn( "创建设备失败" );
		return false;
	}

	return true;	
}

/////////////////////////////////////////////////////////////////////
//释放D3D
/////////////////////////////////////////////////////////////////////
void CD3DApp::FreeD3D()
{
	SafeRelease( m_pDevice );
	SafeRelease( m_pD3D9 );
}

/////////////////////////////////////////////////////////////////////
//初始化图形层
/////////////////////////////////////////////////////////////////////
bool CD3DApp::InitApp()
{
	if ( !theSnapshot.Init() )
	{
		Warn( "Snapshot init failed" );
		return false;
	}
	
	if ( !theMaterialManager.Init() )
	{
		Warn( "MaterialManager init failed" );
		return false;
	}

	if ( !theGameRender.Init( m_pDevice ) )
	{
		Warn( "GameRender init failed" );
		return false;
	}

	theCamera.LookAtZ( -4.5f );
	theCamera.RotationR( AngleToRadian(15.0f ) );
	return true;
}

/////////////////////////////////////////////////////////////////////
//释放图形层
/////////////////////////////////////////////////////////////////////
void CD3DApp::FreeApp()
{
	theSnapshot.Free();

	theMaterialManager.Free();

	theGameRender.Free();
}

/////////////////////////////////////////////////////////////////////
//渲染
/////////////////////////////////////////////////////////////////////
void CD3DApp::Render()
{
	if ( m_pDevice == NULL ) return;

	//设置视图矩阵:
	D3DXMATRIX v;
	theCamera.GetViewMatirx( v );
	m_pDevice->SetTransform( D3DTS_VIEW, &v );

	//设置投影矩阵:
	D3DXMATRIX m;
	D3DXMatrixPerspectiveFovLH( &m,
								D3DX_PI / 4.0f,
								(float)800 / (float)600,
								1.0f,
								500.0f
								);

	m_pDevice->SetTransform( D3DTS_PROJECTION, &m );

	//清空表面:
	m_pDevice->Clear( 0, NULL,
					  D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,	
					  m_Color,
					  1.0f, 0
					);


	//绘制:
	m_pDevice->BeginScene();

	theLight.SetLight( m_pDevice );
	

	theGameRender.Draw( m_pDevice );

	m_pDevice->EndScene();
	theSnapshot.ScreenShot( m_pDevice );
	m_pDevice->Present( NULL, NULL, NULL, NULL );
}

⌨️ 快捷键说明

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