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

📄 main.cpp

📁 DirectX 8 教程第二章代码
💻 CPP
字号:
#include <d3d8.h>
//一个指向DIRECT3D8对象的指针
LPDIRECT3D8 g_pD3D = NULL;
//一个指向DIRECT3DDEVICE8设备对象的指针
LPDIRECT3DDEVICE8 g_pD3DDevice = NULL; 
// Buffer to hold vertices
//声明一个用于保存顶点的缓冲区
LPDIRECT3DVERTEXBUFFER8 g_pVertexBuffer = NULL;


struct CUSTOMVERTEX
{
	// The transformed position for the vertex.
	// 顶点坐标的变换
    FLOAT x, y, z, rhw;		
    // The vertex colour.
	//顶点颜色
	DWORD colour;			
	
};

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

#define SafeRelease(pObject) if(pObject != NULL) {pObject->Release(); pObject=NULL;}

//初始化D3D对象
HRESULT InitialiseD3D(HWND hWnd)
{
    //First of all, create the main D3D object. If it is created successfully we 
    //should get a pointer to an IDirect3D8 interface.
    //构造一个D3D对象
	g_pD3D = Direct3DCreate8(D3D_SDK_VERSION);
    if(g_pD3D == NULL)
    {
        return E_FAIL;
    }

    //Get the current display mode
	//得到现实模式
    D3DDISPLAYMODE d3ddm;
    if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
    {
        return E_FAIL;
    }

    //Create a structure to hold the settings for our device
	//申明一个D3DPRESENT_PARAMETERS结构体用来保存当前显示设备设置
    D3DPRESENT_PARAMETERS d3dpp; 
    ZeroMemory(&d3dpp, sizeof(d3dpp));

    //Fill the structure. 
    //We want our program to be windowed, and set the back buffer to a format
    //that matches our current display mode
	//填充结构体,用于显示当前显示模式模式
	//窗体模式
    d3dpp.Windowed = TRUE;
	//
    d3dpp.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC;
    d3dpp.BackBufferFormat = d3ddm.Format;

    //Create a Direct3D device.
	//创建设备对象
    if(FAILED(g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, 
								    D3DDEVTYPE_HAL, 
									hWnd, 
                                    D3DCREATE_SOFTWARE_VERTEXPROCESSING, 
									&d3dpp, 
									&g_pD3DDevice)))
    {
        return E_FAIL;
    }
    
    return S_OK;
}

//初始化顶点缓冲区
HRESULT InitialiseVertexBuffer()
{
	VOID* pVertices;
	//保存三角形各个顶点以及它们的颜色
	//Store each point of the triangle together with it's colour
	CUSTOMVERTEX cvVertices[] =
	{
		{250.0f, 100.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 0),},	//Vertex 1 - Red	(250, 100)
		{400.0f, 350.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0),},	//Vertex 2 - Green	(400, 350)
		{100.0f, 350.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255),},	//Vertex 3 - Blue	(100, 350)
        {400.0f, 100.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 0),},
		{400.0f, 350.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0),},
		{100.0f, 350.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255),},
	};
     //从设备创建顶点缓冲
	//Create the vertex buffer from our device
	if(FAILED(g_pD3DDevice->CreateVertexBuffer(6 * sizeof(CUSTOMVERTEX),//
                                               0, D3DFVF_CUSTOMVERTEX,
                                               D3DPOOL_DEFAULT, &g_pVertexBuffer)))
	{
		return E_FAIL;
	}

	//得到指向顶点缓冲的指针并锁定顶点缓冲
	//Get a pointer to the vertex buffer vertices and lock the vertex buffer
	if(FAILED(g_pVertexBuffer->Lock(0, sizeof(cvVertices), (BYTE**)&pVertices, 0)))
	{
		return E_FAIL;
	}
    //拷贝保存在cvVertices中的值到顶点缓冲中
	//Copy our stored vertices values into the vertex buffer
	memcpy(pVertices, cvVertices, sizeof(cvVertices));
    //解除顶点缓冲的锁定
	//Unlock the vertex buffer
	g_pVertexBuffer->Unlock();

    return S_OK;
}

void Render()
{
    if(g_pD3DDevice == NULL)
    {
        return;
    }
    //清空背景缓冲为黑色
    //Clear the backbuffer to black
    g_pD3DDevice->Clear( 0, 
						 NULL, 
						 D3DCLEAR_TARGET, 
						 D3DCOLOR_XRGB(0, 0, 0), 
						 1.0f, 
						 0
						);
    
    //Begin the scene
	//开始场景渲染
    g_pD3DDevice->BeginScene();
    
     //渲染三角形
    //Rendering our triangle
	//邦定顶点缓冲到设备数据流中
	g_pD3DDevice->SetStreamSource( 0,  //指定数据流,范围从0-Streams-1 
								   g_pVertexBuffer,  //指向IDirect3DVertexBuffer8接口返回对象的指针,描述所绑定到的数据流对象
								   sizeof(CUSTOMVERTEX));//顶点缓冲大小
	//设置顶点阴影模式
	g_pD3DDevice->SetVertexShader(D3DFVF_CUSTOMVERTEX);
	//顶点缓存渲染顶点
	g_pD3DDevice->DrawPrimitive( D3DPT_TRIANGLELIST,
							     0, 
								 2
								);


    //End the scene
    g_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).
    g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
}

void CleanUp()
{
	SafeRelease(g_pVertexBuffer);
	SafeRelease(g_pD3DDevice);
	SafeRelease(g_pD3D);
}

void GameLoop()
{
    //Enter the game loop
	//开始游戏循环
    MSG msg; 
    BOOL fMessage;

    PeekMessage( &msg, 
				 NULL, 
				 0U, 
				 0U, 
				 PM_NOREMOVE);
    
    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();
        }

    }
}

//The windows message handler
//windows消息处理函数
LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_DESTROY:
			//系统的退出消息
            PostQuitMessage(0);
            return 0;
        break;
        case WM_KEYUP: 
            switch (wParam)
            { 
                case VK_ESCAPE:
                    //User has pressed the escape key, so quit
					//当按下escape键时销毁hWnd指向的窗体
                    DestroyWindow(hWnd);
                    return 0;
                break;
            } 
        break;

    }
          //默认的系统消息处理函数
    return DefWindowProc(hWnd, msg, wParam, lParam);
}

//Application entry point
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
      //Register the window class
	//用于注册windows窗体类的设置
    WNDCLASSEX wc = {sizeof(WNDCLASSEX), CS_CLASSDC, WinProc, 0L, 0L, 
                     GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                     "DX Project 2", NULL};
    RegisterClassEx(&wc);

  	
	//Set the mouse pointer to an arrow
	//设置鼠标指针
    HWND hWnd = CreateWindow("DX Project 2", "www.andypike.com: Tutorial 2", 
                              WS_OVERLAPPEDWINDOW, 50, 50, 500, 500,
                              GetDesktopWindow(), NULL, wc.hInstance, NULL);

	//Initialize Direct3D
	//初始化Direct3D对象
    if(SUCCEEDED(InitialiseD3D(hWnd)))
    { 
        //Show our window
		//显示窗体
        ShowWindow(hWnd, SW_SHOWDEFAULT);
        UpdateWindow(hWnd);

		//刷新窗体显示
		if(SUCCEEDED(InitialiseVertexBuffer()))
		{
		//Start game running: Enter the game loop
		//进入游戏循环
			GameLoop();
		}
    }
    
    //清理资源
    CleanUp();
    //取消窗体类注册
    UnregisterClass("DX Project 2", wc.hInstance);
    
    return 0;
}

⌨️ 快捷键说明

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