• DirectX游戏编程(一):创建一个Direct3D程序


    一、环境

    Visual Studio 2012,DirectX SDK (June 2010)

    二、准备

    1.环境变量(如没有配置请添加)

    变量名:DXSDK_DIR

    变量值:D:SoftwareProgramMicrosoft DirectX SDK (June 2010)

    这里D:SoftwareProgramMicrosoft DirectX SDK (June 2010)是我的DirectX安装目录,视情况修改即可

     三、步骤

    1.打开VS2012,创建一个空的Win32 Project

    这里的项目名称(Name)可以自定义,项目位置(Location)可能不同,不过没关系,可以不用修改

    点击OK,然后点击Next,勾选Empty Project

    点击Finish,完成项目创建。

    2.打开项目属性(Properites),配置项目的DirectX环境

    主要需修改的项:Configuration Properites->VC++ Directories,Configuration Properites->Linker->General,Configuration Properites->Linker->Input

    VC++ Directories:(注意后面的分号)

    Include Directories项中添加$(DXSDK_DIR)Include;

    Library Directories项中添加$(DXSDK_DIR)Libx86;

    Linker->Input:添加以下三个lib文件d3d9.lib  d3dx9.lib Winmm.lib,添加时注意用分号隔开,如下:

    d3d9.lib;d3dx9.lib;Winmm.lib;

    Linker->General:AdditionalLibrary Directories项中添加$(DXSDK_DIR)Libx86 (可以不加分号)

    点击确定应用以上更改。

    3.打开Source.cpp,复制以下代码:

      1 #include <d3dx9.h>
      2 IDirect3DDevice9* Device=0;
      3 LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
      4 {
      5     switch(msg)
      6     {
      7     case WM_DESTROY:PostQuitMessage(0);break;
      8     case WM_KEYDOWN:
      9         if(wParam==VK_ESCAPE)DestroyWindow(hwnd);break;
     10     }
     11     return DefWindowProcW(hwnd,msg,wParam,lParam);
     12 }
     13 bool Init(HINSTANCE hInstance,int width,int height,bool windowed,D3DDEVTYPE devType,IDirect3DDevice9** device)
     14 {
     15     WNDCLASSW wc;
     16     wc.cbClsExtra=0;
     17     wc.cbWndExtra=0;
     18     wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
     19     wc.hCursor=LoadCursorW(0,IDC_ARROW);
     20     wc.hIcon=LoadIconW(0,IDI_APPLICATION);
     21     wc.hInstance=hInstance;
     22     wc.lpfnWndProc=(WNDPROC)WndProc;
     23     wc.lpszClassName=L"Direct3D";
     24     wc.lpszMenuName=0;
     25     wc.style=CS_HREDRAW|CS_VREDRAW;
     26     if(!RegisterClassW(&wc))
     27     {
     28         MessageBoxW(0,L"Register Failed",0,0);
     29         return false;
     30     }
     31 
     32     HWND hwnd=0;
     33     hwnd=CreateWindowW(L"Direct3D",L"Direct3D",WS_OVERLAPPEDWINDOW,0,0,width,height,0,0,hInstance,0);
     34     if(!hwnd)
     35     {
     36         MessageBoxW(0,L"CreateWindow Failed",0,0);
     37         return false;
     38     }
     39     ShowWindow(hwnd,SW_SHOW);
     40     UpdateWindow(hwnd);
     41 
     42     HRESULT hr;
     43     IDirect3D9* d3d9;
     44     d3d9=Direct3DCreate9(D3D_SDK_VERSION);
     45     
     46     int vp=0;
     47     D3DCAPS9 caps;
     48     d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT,devType,&caps);
     49     if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
     50         vp=D3DCREATE_HARDWARE_VERTEXPROCESSING;
     51     else vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
     52 
     53     D3DPRESENT_PARAMETERS d3dapp;
     54     d3dapp.AutoDepthStencilFormat=D3DFMT_D24S8;
     55     d3dapp.BackBufferCount=1;
     56     d3dapp.BackBufferFormat=D3DFMT_A8R8G8B8;
     57     d3dapp.BackBufferHeight=height;
     58     d3dapp.BackBufferWidth=width;
     59     d3dapp.EnableAutoDepthStencil=true;
     60     d3dapp.Flags=0;
     61     d3dapp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;
     62     d3dapp.hDeviceWindow=hwnd;
     63     d3dapp.MultiSampleQuality=0;
     64     d3dapp.MultiSampleType=D3DMULTISAMPLE_NONE;
     65     d3dapp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;
     66     d3dapp.SwapEffect=D3DSWAPEFFECT_DISCARD;
     67     d3dapp.Windowed=windowed;
     68     hr=d3d9->CreateDevice(D3DADAPTER_DEFAULT,devType,hwnd,vp,&d3dapp,device);
     69     if(FAILED(hr))
     70     {
     71         MessageBoxW(0,L"CreateDevice Failed",0,0);
     72         d3d9->Release();
     73         return false;
     74     }
     75     d3d9->Release();
     76     return true;
     77 }
     78 int EnterMsgLoop(bool (*ptr_display)(float TimeDelta))
     79 {
     80     MSG msg;
     81     ZeroMemory(&msg,sizeof(MSG));
     82     float LastTime=(float)GetCurrentTime();
     83     while(msg.message!=WM_QUIT)
     84     {
     85         if(PeekMessageW(&msg,0,0,0,PM_REMOVE))
     86         {
     87             TranslateMessage(&msg);
     88             DispatchMessageW(&msg);
     89         }
     90         else 
     91         {
     92             float CurTime=(float)GetCurrentTime();
     93             float TimeDelta=(float)(CurTime-LastTime)*0.001f;
     94             ptr_display(TimeDelta);
     95             LastTime=CurTime;
     96         }
     97     }
     98     return msg.wParam;
     99 }
    100 bool Setup()
    101 {
    102     return true;
    103 }
    104 void Cleanup()
    105 {
    106 
    107 }
    108 bool Display(float TimeDelta)
    109 {
    110     if(Device)
    111     {
    112         Device->Clear(0,0,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,0x00000000,1.0f,0);
    113         Device->Present(0,0,0,0);
    114     }
    115     return true;
    116 }
    117 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE prevInstance,PSTR cmdLine,int showCmd)
    118 {
    119     if(!Init(hInstance,640,480,true,D3DDEVTYPE_HAL,&Device))
    120         MessageBoxW(0,L"Init Failed",0,0);
    121     if(!Setup())MessageBoxW(0,L"Setup Failed",0,0);
    122     EnterMsgLoop(Display);
    123     Cleanup();
    124     Device->Release();
    125     return 0;
    126 }

    点击Local Windows Debugger编译项目,运行结果如下:

    至此,第一个Direct3D程序已经完工。

    CSDN博客地址:http://blog.csdn.net/lfeng1420

  • 相关阅读:
    论文解读(GraphSMOTE)《GraphSMOTE: Imbalanced Node Classification on Graphs with Graph Neural Networks》 Learner
    变分自编码器理解 Learner
    20192407 202120222 《网络与系统攻防技术》实验八实验报告
    PHP 通过Spreadsheet导出Excel文件
    修改eltabs的下划线的transform属性,达到修改滑动距离的效果
    flexwrap: wrap 之后元素上下间距过大怎么解决?
    OCSP相关
    console中常用的几个方法
    基于qt的数字电路自动设计软件电子与通信工程专业论文.docx
    解决Vmware安装Windows10提示没有映像文件
  • 原文地址:https://www.cnblogs.com/lfeng/p/3585464.html
Copyright © 2020-2023  润新知