2017-04-25 23 views
0


我想要什麼?
要在2種背景顏色(可以說是白色和紅色)之間切換得更加具體,我希望屏幕始終爲白色,並且對於1幀(這個很短)是紅色的,可以說是500ms
我知道什麼?
好了不多,我找了一整天這麼簡單的例子,但所有我能找到這麼複雜的比較,我想要的東西,所以任何簡單教程帶微笑:)
接受我爲什麼使用的DirectX?
我試圖在OpenGL上沒有成功,here有人告訴我我應該使用this,但我不知道該如何也找不到在哪裏學習...... DX的版本並不重要我,我只是需要儘可能快儘可能..
所以,我希望你能幫助我,謝謝反正:)如何在DirectX中切換背景顏色

UPDATE:還是沒有答應

回答

1

我做我希望能提供幫助。請嘗試以下步驟:

包括基本的Windows頭文件和Direct3D的頭文件:

#include <windows.h> 
#include <windowsx.h> 
#include <d3d9.h> 

包括Direct3D的庫文件:

#pragma comment (lib, "d3d9.lib") 

然後添加以下代碼太:

// global declarations 
LPDIRECT3D9 d3d; // the pointer to our Direct3D interface 
LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class 

// function prototypes 
void initD3D(HWND hWnd); // sets up and initializes Direct3D 
void render_frame(void); // renders a single frame 
void cleanD3D(void); // closes Direct3D and releases memory 

// the WindowProc function prototype 
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); 


// the entry point for any Windows program 
int WINAPI WinMain(HINSTANCE hInstance, 
        HINSTANCE hPrevInstance, 
        LPSTR lpCmdLine, 
        int nCmdShow) 
{ 
    HWND hWnd; 
    WNDCLASSEX wc; 

    ZeroMemory(&wc, sizeof(WNDCLASSEX)); 

    wc.cbSize = sizeof(WNDCLASSEX); 
    wc.style = CS_HREDRAW | CS_VREDRAW; 
    wc.lpfnWndProc = (WNDPROC)WindowProc; 
    wc.hInstance = hInstance; 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW; 
    wc.lpszClassName = L"WindowClass"; 

    RegisterClassEx(&wc); 

    hWnd = CreateWindowEx(NULL, 
          L"WindowClass", 
          L"Our First Direct3D Program", 
          WS_OVERLAPPEDWINDOW, 
          300, 300, 
          640, 480, 
          NULL, 
          NULL, 
          hInstance, 
          NULL); 

    ShowWindow(hWnd, nCmdShow); 

    // set up and initialize Direct3D 
    initD3D(hWnd); 

    // enter the main loop: 

    MSG msg; 

    while(TRUE) 
    { 
     DWORD starting_point = GetTickCount(); 

     if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
     { 
      if (msg.message == WM_QUIT) 
       break; 

      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 

     render_frame(); 

     while ((GetTickCount() - starting_point) < 25); 
    } 

    // clean up DirectX and COM 
    cleanD3D(); 

    return msg.wParam; 
} 

// this is the main message handler for the program 
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch(message) 
    { 
     case WM_DESTROY: 
      { 
       PostQuitMessage(0); 
       return 0; 
      } break; 
    } 

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

// this function initializes and prepares Direct3D for use 
void initD3D(HWND hWnd) 
{ 
    d3d = Direct3DCreate9(D3D_SDK_VERSION); // create the Direct3D interface 

    D3DPRESENT_PARAMETERS d3dpp; // create a struct to hold various device information 

    ZeroMemory(&d3dpp, sizeof(d3dpp)); // clear out the struct for use 
    d3dpp.Windowed = TRUE; // program windowed, not fullscreen 
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // discard old frames 
    d3dpp.hDeviceWindow = hWnd; // set the window to be used by Direct3D 


    // create a device class using this information and the info from the d3dpp stuct 
    d3d->CreateDevice(D3DADAPTER_DEFAULT, 
         D3DDEVTYPE_HAL, 
         hWnd, 
         D3DCREATE_SOFTWARE_VERTEXPROCESSING, 
         &d3dpp, 
         &d3ddev); 

    return; 
} 

// this is the function used to render a single frame 
void render_frame(void) 
{ 
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0); 

    d3ddev->BeginScene(); // begins the 3D scene 

    // do 3D rendering here 

    d3ddev->EndScene(); // ends the 3D scene 

    d3ddev->Present(NULL, NULL, NULL, NULL); // displays the created frame on the screen 

    return; 
} 

// this is the function that cleans up Direct3D and COM 
void cleanD3D(void) 
{ 
    d3ddev->Release(); // close and release the 3D device 
    d3d->Release(); // close and release Direct3D 

    return; 
} 
+0

謝謝你的回答!但是,我只是看到一個藍色的屏幕,我如何確認1幀是紅色的?通常我在回到原始數字之前使用'睡眠(500)',但在這裏我不明白我需要把它放在哪裏。 – Hido

+0

@Peewe看看這個[鏈接](https://www.gamedev.net/topic/519829-changing-background-color-during-runtime/) –

+0

我需要做的就是調用render_frame '又一次。謝謝! – Hido