亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? game.cpp

?? DirectX 8 教程 第八章源代碼下載 可以運(yùn)行
?? CPP
字號(hào):
// Game.cpp: implementation of the CGame class.
//
//////////////////////////////////////////////////////////////////////

#include "Game.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CGame::CGame()
{
	m_fEnableLogging = false;

	m_pD3D = NULL;
	m_pD3DDevice = NULL;
	m_dwFrames = 0;
	m_dwStartTime = 0;
	m_dwEndTime = 0;
	m_dwTotalPolygons = 0;

	m_pCube1 = NULL;
	m_pTerrain1 = NULL;
}

CGame::~CGame()
{
	//Game finished, so record time
	if(m_dwStartTime > 0)
	{
		m_dwEndTime = timeGetTime();
	}
	else
	{
		m_dwEndTime = 0;
	}


	DWORD dwDuration = (m_dwEndTime - m_dwStartTime) / 1000;
	
	//Log stats
	WriteToLog("Statistics:");
	WriteToLog("\tStart Time (ms): %d", m_dwStartTime);
	WriteToLog("\tEnd Time (ms): %d", m_dwEndTime);
	WriteToLog("\tDuration (s): %d", dwDuration);
	WriteToLog("\tTotal Frame Count: %d", m_dwFrames);
	WriteToLog("\tAverage FPS: %d", (m_dwFrames / dwDuration));
	WriteToLog("\tTotal Polygons: %d", m_dwTotalPolygons);
	WriteToLog("\tAverage Polygons per Frame: %d", (m_dwTotalPolygons / m_dwFrames));

	
	SafeDelete(m_pCube1);
	SafeDelete(m_pTerrain1);

	SafeRelease(m_pD3DDevice);
	SafeRelease(m_pD3D);
}

bool CGame::Initialise(HWND hWnd, UINT nWidth, UINT nHeight)
{
	if(SUCCEEDED(InitialiseD3D(hWnd, nWidth, nHeight)))
	{
		if(InitialiseLights()) 
		{
			return InitialiseGame();
		}
		else
		{
			return false;
		}
	}
	else
	{
		return false;
	}

	return true;
}

bool CGame::InitialiseGame()
{
	//Setup games objects here
	m_pCube1 = new CCuboid(m_pD3DDevice, 0, 100, 0);
	m_pCube1->SetSize(30, 30, 30);
	m_pCube1->SetTexture("Cube.bmp");

	//Create our terrain object (device, tile rows, tile cols, tile size, max height)
	m_pTerrain1 = new CTerrain(m_pD3DDevice, 20, 20, 10.0, 15);
	m_pTerrain1->SetTexture("Grass.bmp");

	WriteToLog("InitialiseGame Finished OK");

	return true;
}

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(0, 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;
}

HRESULT CGame::InitialiseD3D(HWND hWnd, UINT nWidth, UINT nHeight)
{
	WriteToLog("InitialiseD3D Started...");

    //First of all, create the main D3D object. If it is created successfully we 
    //should get a pointer to an IDirect3D8 interface.
    m_pD3D = Direct3DCreate8(D3D_SDK_VERSION);
    if(m_pD3D == NULL)
    {
		WriteToLog("\tUnable to create DirectX8 interface.");
        return E_FAIL;
    }

    //Get the current display mode
    D3DDISPLAYMODE d3ddm;

	d3ddm.Format = CheckDisplayMode(nWidth, nHeight, 32);
	if(d3ddm.Format != D3DFMT_UNKNOWN)
	{
		//Width x Height x 32bit has been selected
		d3ddm.Width = nWidth;
		d3ddm.Height = nHeight;

		WriteToLog("\t%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)
		{
            //Width x Height x 16bit has been selected
			d3ddm.Width = nWidth;
			d3ddm.Height = nHeight;

			WriteToLog("\t%d x %d x 16bit back buffer format selected. Format = %d.", nWidth, nHeight, d3ddm.Format);
		}
        else
		{
			WriteToLog("\tUnable to select back buffer format for %d x %d.", nWidth, nHeight);
            return E_FAIL;
        }
	}


    //Create a structure to hold the settings for our 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_ONE;

	//Select the best depth buffer, select 32, 24 or 16 bit
    if(m_pD3D->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3ddm.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D32) == D3D_OK)
	{
        d3dpp.AutoDepthStencilFormat = D3DFMT_D32;
        d3dpp.EnableAutoDepthStencil = TRUE;

		WriteToLog("\t32bit depth buffer selected");
    }
    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;

		WriteToLog("\t24bit depth 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;

		WriteToLog("\t16bit depth buffer selected");
	}
    else
	{
        d3dpp.EnableAutoDepthStencil = FALSE;
		WriteToLog("\tUnable to select depth buffer.");
	}


    //Create a Direct3D device.
    if(FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, 
                                   D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &m_pD3DDevice)))
    {
		WriteToLog("\tUnable to create device.");
        return E_FAIL;
    }
    
	//Turn on back face culling. This is becuase we want to hide the back of our polygons
    m_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);

	//Turn on Depth Buffering
    m_pD3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);

	//Set fill state. Possible values: D3DFILL_POINT, D3DFILL_WIREFRAME, D3DFILL_SOLID
	m_pD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); 

	WriteToLog("InitialiseD3D Finished OK");

    return S_OK;
}

bool CGame::InitialiseLights()
{
	WriteToLog("InitialiseLights Started...");
	
	D3DLIGHT8 d3dLight;

	//Initialize the light structure.
	ZeroMemory(&d3dLight, sizeof(D3DLIGHT8));

	d3dLight.Type = D3DLIGHT_DIRECTIONAL;
	
	d3dLight.Diffuse.r = 1.0f;
	d3dLight.Diffuse.g = 1.0f;
	d3dLight.Diffuse.b = 1.0f;
	
	d3dLight.Ambient.r = 0.0f;
	d3dLight.Ambient.g = 0.0f;
	d3dLight.Ambient.b = 0.0f;
	
	d3dLight.Specular.r = 0.0f;
	d3dLight.Specular.g	= 0.0f;
	d3dLight.Specular.b	= 0.0f;

	d3dLight.Direction = D3DXVECTOR3(-1.0, -1.0, 0.0);

	//Assign the point light to our device in poisition (index) 0
	if(FAILED(m_pD3DDevice->SetLight(0, &d3dLight)))
	{
		WriteToLog("\tSetLight Failed");
		return false;
	}
	else
	{
		WriteToLog("\tSetLight OK");
	}

	//Enable our point light in position (index) 0
	if(FAILED(m_pD3DDevice->LightEnable(0, TRUE)))
	{
		WriteToLog("\tLightEnable Failed");
		return false;
	}
	else
	{
		WriteToLog("\tLightEnable OK");
	}

	//Turn on lighting
    if(FAILED(m_pD3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE)))
	{
		WriteToLog("\tSetRenderState: D3DRS_LIGHTING Failed");
		return false;
	}
	else
	{
		WriteToLog("\tSetRenderState: D3DRS_LIGHTING OK");
	}

	//Set ambient light level
	if(FAILED(m_pD3DDevice->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_XRGB(60, 60, 60))))	
	{
		WriteToLog("\tSetRenderState: D3DRS_AMBIENT Failed");
		return false;
	}
	else
	{
		WriteToLog("\tSetRenderState: D3DRS_AMBIENT OK");
	}

	WriteToLog("InitialiseLights Finished OK");
	return true;
}

LPDIRECT3DDEVICE8 CGame::GetDevice()
{
	return m_pD3DDevice;
}

void CGame::GameLoop()
{
    //Enter the game loop
    MSG msg; 
    BOOL fMessage;

    PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);

	//Game started, so record time
	m_dwStartTime = timeGetTime();

    while(msg.message != WM_QUIT)
    {
        fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE);

        if(fMessage)
        {
            //Process message
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            //No message to process, so render the current scene
            Render();
        }

    }
}

void CGame::Render()
{
    D3DXMATRIX matWorldY;

	if(m_pD3DDevice == NULL)
    {
        return;
    }

    //Clear the back buffer and depth buffer
    m_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
    
    //Begin the scene
    m_pD3DDevice->BeginScene();
    
	//Setup camera and perspective
	SetupCamera();

	//Create the rotation transformation matrices around the Y axis
	D3DXMatrixRotationY(&matWorldY, timeGetTime()/2000.0f);
	m_pD3DDevice->SetTransform(D3DTS_WORLD, &matWorldY);

	//Render our objects
	m_dwTotalPolygons += m_pCube1->Render();
	m_dwTotalPolygons += m_pTerrain1->Render();
	
    //End the scene
    m_pD3DDevice->EndScene();
    
    //Filp the back and front buffers so that whatever has been rendered on the back buffer
    //will now be visible on screen (front buffer).
    m_pD3DDevice->Present(NULL, NULL, NULL, NULL);

	//Count Frames
	m_dwFrames++;
}

void CGame::SetupCamera()
{
	//Here we will setup the camera.
	//The camera has three settings: "Camera Position", "Look at Position" and "Up Direction"
	//We have set the following:
	//Camera Position:	(0, 200, -300)
	//Look at Position: (0, 0, 0)
	//Up direction:		Y-Axis.
    D3DXMATRIX matView;
    D3DXMatrixLookAtLH(&matView, &D3DXVECTOR3(0.0f, 200.0f, -300.0f),	//Camera Position
                                 &D3DXVECTOR3(0.0f, 0.0f, 0.0f),		//Look At Position
                                 &D3DXVECTOR3(0.0f, 1.0f, 0.0f));		//Up Direction
    m_pD3DDevice->SetTransform(D3DTS_VIEW, &matView);

	//Here we specify the field of view, aspect ration and near and far clipping planes.
    D3DXMATRIX matProj;
    D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.0f, 1.0f, 2000.0f);
    m_pD3DDevice->SetTransform(D3DTS_PROJECTION, &matProj);
}

void CGame::WriteToLog(char *lpszText, ...)
{
	if(m_fEnableLogging)
	{
		va_list argList;
		FILE *pFile;

		//Initialize variable argument list
		va_start(argList, lpszText);

		//Open the log file for appending
		pFile = fopen("log.txt", "a+");

		//Write the text and a newline
		vfprintf(pFile, lpszText, argList);
		putc('\n', pFile);

		//Close the file
		fclose(pFile);
		va_end(argList);
	}
}

void CGame::EnableLogging()
{
	m_fEnableLogging = true;
	
	FILE* pFile;

	//Clear the file contents
	pFile = fopen("log.txt", "wb");

	//Close it up and return success
	fclose(pFile);
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人黄色在线视频| 欧美日韩精品一区视频| 日日摸夜夜添夜夜添亚洲女人| 精品久久五月天| 欧美日韩情趣电影| aaa欧美大片| 国产一区二区三区免费| 亚洲成人自拍网| 国产精品免费视频观看| 久久综合狠狠综合久久综合88 | 欧美成人福利视频| 欧美伊人久久大香线蕉综合69| 高清久久久久久| 国产综合色视频| 美女看a上一区| 午夜激情久久久| 一区二区三区在线观看动漫| 中文字幕精品一区二区精品绿巨人| 精品捆绑美女sm三区| 欧美电影在哪看比较好| 欧美自拍偷拍一区| 色av成人天堂桃色av| 99re66热这里只有精品3直播| 国产精品66部| 精品一区二区三区免费播放| 日本欧美一区二区三区乱码| 亚洲小说欧美激情另类| 一区二区三区精密机械公司| 亚洲精品国产无天堂网2021| 中文字幕不卡在线观看| 国产精品乱子久久久久| 久久久亚洲高清| 久久久亚洲精品一区二区三区| 久久综合一区二区| 久久久www成人免费无遮挡大片| 精品国产第一区二区三区观看体验| 精品日本一线二线三线不卡| 日韩精品一区二区在线观看| 欧美电影免费提供在线观看| 欧美v亚洲v综合ⅴ国产v| 日韩免费在线观看| 久久久综合激的五月天| 国产人久久人人人人爽| 国产精品免费看片| 亚洲精品乱码久久久久久久久 | 欧美日韩成人综合| 在线电影一区二区三区| 91精选在线观看| 日韩欧美一区电影| 久久久一区二区| 国产精品免费av| 一区二区三区日韩欧美| 午夜激情综合网| 久久国产欧美日韩精品| 国产精品资源在线观看| av爱爱亚洲一区| 欧美视频一区二| 91精品视频网| 久久久久久久久久久99999| 国产精品高潮久久久久无| 亚洲激情在线激情| 免费成人在线视频观看| 国产成人免费高清| 日本高清免费不卡视频| 日韩视频在线你懂得| 国产欧美日韩视频在线观看| 亚洲人成网站色在线观看| 天天亚洲美女在线视频| 国产一区视频网站| 91麻豆123| 欧美一区二区精品久久911| 国产校园另类小说区| 一区二区三区视频在线看| 三级亚洲高清视频| 国产大陆a不卡| 色婷婷av一区二区三区大白胸 | av日韩在线网站| 欧美性xxxxx极品少妇| 精品国产免费一区二区三区香蕉| 国产精品久久久久毛片软件| 午夜视黄欧洲亚洲| 风间由美性色一区二区三区| 欧美影院午夜播放| 国产欧美一二三区| 天天av天天翘天天综合网 | 捆绑变态av一区二区三区| 91香蕉国产在线观看软件| 精品精品国产高清一毛片一天堂| 日韩一区中文字幕| 久久精品国产一区二区| 色噜噜狠狠色综合欧洲selulu| 日韩精品自拍偷拍| 亚洲在线视频一区| 成人免费看片app下载| 欧美精品色一区二区三区| 日韩一区在线看| 国产中文一区二区三区| 欧美日韩亚洲综合| 中文字幕亚洲在| 狠狠色综合播放一区二区| 欧美日韩国产综合视频在线观看 | 欧美国产一区二区| 日本不卡中文字幕| 欧美亚洲另类激情小说| 国产精品卡一卡二卡三| 精彩视频一区二区| 欧美一区欧美二区| 亚洲国产美国国产综合一区二区| 成人av午夜影院| 久久视频一区二区| 轻轻草成人在线| 欧美日韩国产影片| 亚洲国产色一区| 91蜜桃免费观看视频| 欧美经典一区二区| 国产精品一二三四区| 欧美成人激情免费网| 免费观看在线色综合| 在线播放日韩导航| 偷窥国产亚洲免费视频| 91久久精品网| 亚洲精品久久久蜜桃| 91国产免费观看| 亚洲精品日日夜夜| 一本久道中文字幕精品亚洲嫩| 综合久久久久综合| 91麻豆6部合集magnet| 自拍偷拍国产精品| 不卡影院免费观看| 中文字幕一区二区在线播放| 成人少妇影院yyyy| 国产精品久久久久永久免费观看 | 亚洲大片在线观看| 欧美日韩国产美| 无吗不卡中文字幕| 欧美一区永久视频免费观看| 日韩电影在线免费| 精品久久久久久久人人人人传媒 | 欧美午夜电影网| 香蕉乱码成人久久天堂爱免费| 欧美日韩精品一区二区三区四区 | 在线免费一区三区| 亚洲国产裸拍裸体视频在线观看乱了 | 亚洲精品国产无天堂网2021| 在线免费av一区| 丝袜诱惑制服诱惑色一区在线观看 | 欧美高清在线视频| 色综合一区二区| 亚洲午夜一区二区| 91精品国产一区二区三区蜜臀| 青青草国产成人av片免费| 欧美xxx久久| 高清不卡在线观看av| 亚洲情趣在线观看| 欧美日韩国产美| 久久91精品国产91久久小草| 国产偷v国产偷v亚洲高清| www.久久精品| 亚洲国产aⅴ成人精品无吗| 欧美成人在线直播| 不卡一区中文字幕| 午夜视黄欧洲亚洲| 久久精品网站免费观看| 91女厕偷拍女厕偷拍高清| 视频一区二区不卡| 日本一区二区电影| 欧美专区日韩专区| 激情图片小说一区| 亚洲欧美日韩国产另类专区| 91麻豆精品国产91久久久使用方法 | 国产精品拍天天在线| 欧美艳星brazzers| 极品美女销魂一区二区三区| 中文字幕一区在线观看视频| 欧美精品123区| 国产成人av电影免费在线观看| 亚洲一区在线免费观看| 精品国产一区二区国模嫣然| 99国产精品视频免费观看| 美腿丝袜亚洲色图| 亚洲私人黄色宅男| 欧美电视剧在线观看完整版| 97久久精品人人爽人人爽蜜臀| 美女视频黄免费的久久 | 亚洲日本免费电影| 欧美电视剧在线观看完整版| 91猫先生在线| 国产在线乱码一区二区三区| 亚洲免费在线观看视频| 欧美成人免费网站| 欧美性一区二区| 成人午夜在线免费| 久久不见久久见免费视频1| 亚洲狼人国产精品| 国产女主播一区| 欧美一区二区久久久| 91国偷自产一区二区三区观看 | 国产在线一区观看| 丝袜美腿亚洲综合| 亚洲乱码国产乱码精品精的特点|