游戏开发初步2-用DirectX画三角形

今天运气还好!
在网上碰到了一位编游戏的前辈,也是郑州市的,然后我请教了他很多问题,也终于知道了买游戏开发书籍的地方,原来是文化路上的金宇书店和文化路上农业大学对面书店及工大对面秋实书店都有卖的。
我想回来买本<<Windows游戏编程大师技>>看看!
今天能继续坚持把blog写完也算我的进步,以前从来都是缺乏耐心的。
我yaomingjie一定要坚持!!I leak encourage!!
因为三角形是3d图形的最小单位,所以如果会画三角形,以后在处理其他图形时就方便了。
看了一个下午,终于画出了一个正方形。

#include "d3d8.h"

LPDIRECT3D8 g_pD3D = NULL;
LPDIRECT3DDEVICE8 g_pD3Dev = NULL;

//定义顶点缓冲区
LPDIRECT3DVERTEXBUFFER8  g_pVertexBuffer;

//定于一个三角形的结构,包括三个点和颜色
struct CUSTOMVERTEX
{
 FLOAT x,y,z,rhw;
 DWORD color;
};
//DX原有的两个标识D3DFVF_XYZRHW和D3DFVF_DIFFUSE(已转换顶点和扩散颜色)
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
//定义了一个宏函数方便的释放COM对象
#define SafeRelease(pObject) if (pObject != NULL) {pObject->Release(); pObject = NULL;}

HRESULT InitiD3D(HWND hWnd)
{
    g_pD3D = Direct3DCreate8(D3D_SDK_VERSION);
    if(g_pD3D == NULL)
    {
        return E_FAIL;
    }

    D3DDISPLAYMODE d3ddm;
    if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
    {
        return E_FAIL;
    }

 //创建一个结构保存对的device的设置
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof(d3dpp));

    //初始化相关参数
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC;
    d3dpp.BackBufferFormat = d3ddm.Format;

    //创建一个3d设备
    if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                   D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pD3Dev)))
    {
        return E_FAIL;
    }
    
    return S_OK;
}

//初始化三角形属性的函数(FVF)
HRESULT InitVertexBuffer()
{
 VOID *pVertices;
 //三角形各个顶点及其初始颜色,画出来的图形会根据初始颜色过渡性的填充三角形
 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)
 };

 //创建顶点缓冲,并获得指向顶点缓冲的指针g_pVertexBuffer,有了顶点缓冲可方便的对图形进行渲染,剪裁等处理
 if (FAILED(g_pD3Dev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,
  D3DPOOL_DEFAULT,&g_pVertexBuffer)))
 {
  return E_FAIL;
 }

 //获得并锁定缓冲区中的数据
 if (FAILED(g_pVertexBuffer->Lock(0,sizeof(cvVertices),(BYTE**)&pVertices,0)))
 {
  return E_FAIL;
 }
 //把CUSTOMVERTEX中定义的三角形属性值拷到pVertices中..
 memcpy(pVertices, cvVertices, sizeof(cvVertices));
  g_pVertexBuffer->Unlock();
 return S_OK;


}

void render()
{
 if (g_pD3Dev == NULL)
 {
  return ;
 }

 g_pD3Dev->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);

 g_pD3Dev->BeginScene();
 //用在InitVertexBuffer函数中捆绑了顶点缓冲到设备数据流中
 g_pD3Dev->SetStreamSource(0,g_pVertexBuffer,sizeof(CUSTOMVERTEX));
 //设置着色方法
 g_pD3Dev->SetVertexShader(D3DFVF_CUSTOMVERTEX);
 //参数含义第一个为画的类型,第二个是选择哪个点做三角形的定点,第三个是画几个三角形,Primitives为原始的意思
 g_pD3Dev->DrawPrimitive(D3DPT_TRIANGLELIST , 0, 1);
 g_pD3Dev->EndScene();
 g_pD3Dev->Present(NULL,NULL,NULL,NULL);
}

void CleanUp()
{
 SafeRelease(g_pD3Dev);
 SafeRelease(g_pD3D);
 SafeRelease(g_pVertexBuffer);

}

void GameLoop()
{
 MSG msg;
 BOOL fMessage;

 PeekMessage(&msg,NULL,0U,0U,PM_NOREMOVE);//PM_NOREMOVE表示PeekMessage消息处理后不从队列里删去

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

  if (fMessage)
  {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
  }
  else
  {
   render();
  }
 }

}

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:
    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
    WNDCLASSEX wc = {sizeof(WNDCLASSEX), CS_CLASSDC, WinProc, 0L, 0L,
                     GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                     "DX Project 2", NULL};
    RegisterClassEx(&wc);

    //Create the application's window
    HWND hWnd = CreateWindow("DX Project 2", "Study DirectX",
                              WS_OVERLAPPEDWINDOW, 50, 50, 500, 500,
                              NULL, NULL, wc.hInstance, NULL);

    //Initialize Direct3D
    if(SUCCEEDED(InitiD3D(hWnd)))
    {
        //Show our window
        ShowWindow(hWnd, SW_SHOWDEFAULT);
        UpdateWindow(hWnd);

  //Initialize Vertex Buffer
  if(SUCCEEDED(InitVertexBuffer()))
  {
   //Start game running: Enter the game loop
   GameLoop();
  }
    }
    
    CleanUp();

    UnregisterClass("DX Project 2", wc.hInstance);
    
    return 0;
}


程序运行后是一个带有渐变色的三角形, ,还算好
明天准备好了花一个3D的图形。

好困阿,现在在公司搞程序的叔叔们头发都白了,他们告诫我
25岁以后就不要开发程序了,呵呵,我还有5年时间阿!
我会变得很强的!!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值