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

📄 game_root.cpp

📁 自己写的一个D3D游戏Dome。实现了基本的游戏功能
💻 CPP
字号:
#include "..\Include\Game_Root.h"
#include "..\Include\Game_Timer.h"
#include "..\Include\Game_Input.h"
//#include "..\Include\Game_Hero.h"
#include "..\Include\Game_Camera.h"
#include "..\Include\Game_Font.h"

GlobalObject g_sGlobal;

void Update(float timeStep){
	if (g_sGlobal.g_pGame_Input) g_sGlobal.g_pGame_Input->Update();
}

void Loading(INT process){
	g_sGlobal.g_pDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 255, 255, 255), 1.0f, 0);
	g_sGlobal.g_pDevice->BeginScene();

	g_sGlobal.g_pLoading->Render();

	g_sGlobal.g_pSprite->Begin(D3DXSPRITE_ALPHABLEND);
	D3DXMATRIX mat;
	D3DXMatrixIdentity(&mat);

	//得到2D坐标转换矩阵
	D3DXMatrixTransformation2D(&mat, NULL, 0.0f, &g_sGlobal.g_pLoadingBar->m_pInterface->m_Scale, 
								NULL, 0.0f, &g_sGlobal.g_pLoadingBar->m_pInterface->m_Position);
	g_sGlobal.g_pSprite->SetTransform(&mat);
	if (g_sGlobal.g_pLoadingBar->m_pInterface->m_nWidth<=0){
		g_sGlobal.g_pLoadingBar->m_pInterface->m_nWidth=0;
	}
	g_sGlobal.g_pLoadingBar->m_pInterface->m_nWidth=process*2;
	
	g_sGlobal.g_pLoadingBar->m_pInterface->m_ShownRect.right=g_sGlobal.g_pLoadingBar->m_pInterface->m_nWidth;
	g_sGlobal.g_pSprite->Draw(g_sGlobal.g_pLoadingBar->m_pInterface->m_pTexture, 
						&g_sGlobal.g_pLoadingBar->m_pInterface->m_ShownRect, NULL, NULL, 0xffffffff);

	g_sGlobal.g_pSprite->End();
	g_sGlobal.g_pDevice->EndScene();
	//翻转缓冲区
	g_sGlobal.g_pDevice->Present(NULL, NULL, NULL, NULL);	
}

void Render(float timeStep){
	g_sGlobal.g_pGameApp->m_pGame_Hero->SetInput3D(timeStep);//输入
	
	g_sGlobal.g_pDevice->Clear(0, NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
	
	g_sGlobal.g_pDevice->BeginScene();
	
	//渲染及摄象机转换
	g_sGlobal.g_pGameApp->m_pGame_Camera->Update3DMatrix();
	g_sGlobal.g_pGameApp->Render3D(timeStep);
	g_sGlobal.g_pGameApp->m_pGame_Font->Render(timeStep);
	g_sGlobal.g_pGameApp->Render2D(timeStep);
	g_sGlobal.g_pLoading->Render();

	g_sGlobal.g_pLoadingBar->Render();
	//结束渲染
	g_sGlobal.g_pDevice->EndScene();
	//翻转缓冲区
	g_sGlobal.g_pDevice->Present(NULL, NULL, NULL, NULL);
}

void MainLoop(){
	// Enter the message loop
	MSG msg; 
	ZeroMemory( &msg, sizeof(msg) );
	while(msg.message!=WM_QUIT){
		if( PeekMessage(&msg,NULL,0U,0U,PM_REMOVE)){
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		else{
			float timeStep = g_sGlobal.g_pGame_Timer->GetElapsedTime();
			Update(timeStep);
			Render(timeStep);
		}
	}
}

bool Setup(wchar_t* title, bool windowed){
	HRESULT result;

	WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, 
		GetModuleHandle(NULL), NULL, LoadCursor( NULL, IDC_ARROW ), NULL, NULL,
		L"EasyBaby", NULL };
	wc.hCursor=LoadCursorFromFile(L"Date\\Interface\\shubiao.cur");
	//wc.hIcon=LoadIcon(hInstance,L"directx.ico");
	//DWORD dwWindowStyle =NULL;//不可最大化
	//DWORD dwWindowStyle =WS_SYSMENU|WS_MAXIMIZEBOX;//不可最大化
	//DWORD dwWindowStyle =WS_OVERLAPPEDWINDOW;

	RegisterClassEx( &wc );

	g_sGlobal.g_hwnd = CreateWindow( L"EasyBaby", title, 
		WS_OVERLAPPEDWINDOW, 100, 100, 800, 600,
		NULL, NULL, wc.hInstance, NULL );


	g_sGlobal.g_pD3D = Direct3DCreate9( D3D_SDK_VERSION );

	ZeroMemory( &g_sGlobal.g_pParameters, sizeof(g_sGlobal.g_pParameters));
	g_sGlobal.g_pParameters.BackBufferCount = 1;
	g_sGlobal.g_pParameters.Windowed = windowed;
	g_sGlobal.g_pParameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
	g_sGlobal.g_pParameters.BackBufferFormat = D3DFMT_UNKNOWN;
	g_sGlobal.g_pParameters.EnableAutoDepthStencil = TRUE;
	g_sGlobal.g_pParameters.AutoDepthStencilFormat = D3DFMT_D16;
	g_sGlobal.g_bWindow=windowed;

	if (!windowed){
		g_sGlobal.g_pParameters.BackBufferWidth = 1024;
		g_sGlobal.g_pParameters.BackBufferHeight = 768;
		g_sGlobal.g_pParameters.BackBufferFormat = D3DFMT_A8R8G8B8;
		g_sGlobal.g_pParameters.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
	}
	else{
		g_sGlobal.g_pParameters.BackBufferWidth = 800;
		g_sGlobal.g_pParameters.BackBufferHeight = 600;
	}
	
	g_sGlobal.g_nScreenWidth=g_sGlobal.g_pParameters.BackBufferWidth;
	g_sGlobal.g_nScreenHeight=g_sGlobal.g_pParameters.BackBufferHeight;

	// Create the D3DDevice
	result = g_sGlobal.g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_sGlobal.g_hwnd,
		D3DCREATE_SOFTWARE_VERTEXPROCESSING,
		&g_sGlobal.g_pParameters, &g_sGlobal.g_pDevice);

	if (result != S_OK) {
		MessageBox(0, L"Create g_pDevice Fail!", L"Error", 0);
		return false;
	}

	//g_sGlobal.g_pDevice->SetRenderState(D3DRS_LIGHTING,D3DZB_FALSE);
	g_sGlobal.g_pDevice->SetRenderState(D3DRS_LIGHTING,true);

	g_sGlobal.g_pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);//D3DCULL_NONE,D3DCULL_CCW
	g_sGlobal.g_pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
	g_sGlobal.g_pDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_LESSEQUAL/*D3DCMP_GREATEREQUAL*D3DCMP_LESSEQUAL//*D3DCMP_LESS*/ );  

	//可以写入Z值缓冲 默认为TRE
	g_sGlobal.g_pDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE); 

	//g_sGlobal.g_pDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
	//g_sGlobal.g_pDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

	//static float fogStart   = 300;      //线性雾化开始位置
	//static float fogEnd     = 2000;     //线性雾化结束位置

	//g_sGlobal.g_pDevice->SetRenderState(D3DRS_FOGCOLOR, 0xffffffff);

	//g_sGlobal.g_pDevice->SetRenderState(D3DRS_FOGENABLE, true);        //激活雾化

	////设置雾化混合因子计算公式
	//g_sGlobal.g_pDevice->SetRenderState(D3DRS_FOGVERTEXMODE,D3DFOG_LINEAR);
	//g_sGlobal.g_pDevice->SetRenderState(D3DRS_FOGSTART,  *(DWORD*)&fogStart);
	//g_sGlobal.g_pDevice->SetRenderState(D3DRS_FOGEND,    *(DWORD*)&fogEnd);
	//g_sGlobal.g_pDevice->SetRenderState(D3DRS_RANGEFOGENABLE, true); //启用基于范围的物化

	//D3DXCreateFont( g_sGlobal.g_pDevice, 14, 7, 1, 0, 0, \
	//DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Arial", &g_sGlobal.font );
	
	D3DXCreateFont(g_sGlobal.g_pDevice,0,0,0,0,0,0,0,0,0, L"Arial", &g_sGlobal.g_pFont);
	D3DXCreateSprite(g_sGlobal.g_pDevice, &g_sGlobal.g_pSprite);

	g_sGlobal.g_pGame_Input = new Game_Input;
	g_sGlobal.g_pGame_Input->Init();
	g_sGlobal.g_pGame_Timer = new Game_Timer;
	if (windowed){//窗口
		g_sGlobal.g_pLoading=new Game_UIBar(L"Date\\Interface\\chibi1.bmp",
									g_sGlobal.g_nScreenWidth,g_sGlobal.g_nScreenHeight,
									D3DXVECTOR2(1.0f,0.6f),D3DXVECTOR2(0,0),true);
		g_sGlobal.g_pLoadingBar=new Game_UIBar(L"Date\\Interface\\LoadingBar.png",
									0,13,D3DXVECTOR2(0.78f,1.0f),
									D3DXVECTOR2(0,g_sGlobal.g_nScreenHeight-(13*2)),true);
	}
	else{//全屏幕
		g_sGlobal.g_pLoading=new Game_UIBar(L"Date\\Interface\\chibi1.bmp",
											g_sGlobal.g_nScreenWidth,g_sGlobal.g_nScreenHeight,
											D3DXVECTOR2(1.0f,0.78f),D3DXVECTOR2(0,0),true);
		g_sGlobal.g_pLoadingBar=new Game_UIBar(L"Date\\Interface\\LoadingBar.png",
											0,13,D3DXVECTOR2(1.0f,1.0f),
											D3DXVECTOR2(0,g_sGlobal.g_nScreenHeight-(13*2)),true);
	}

	UnregisterClass( L"EasyBaby", wc.hInstance );

	ShowWindow( g_sGlobal.g_hwnd, SW_SHOWDEFAULT );
	UpdateWindow( g_sGlobal.g_hwnd );

	return true;
}

void Cleanup(){
	SAFE_RELEASE(g_sGlobal.g_pDevice);
	SAFE_RELEASE(g_sGlobal.g_pD3D);
	SAFE_RELEASE(g_sGlobal.g_pGame_Input);
	SAFE_RELEASE(g_sGlobal.g_pSprite);
}

LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ){
	switch( msg ){
		case WM_DESTROY:
			Cleanup();
			PostQuitMessage( 0 );
			return 0;
	}

	return DefWindowProc( hWnd, msg, wParam, lParam );
}

⌨️ 快捷键说明

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