2017-04-25 87 views
0


私は何をしたいですか?
2つの背景色の間でできるだけ早く切り替えるには(具体的には白と赤)、画面は常に白で表示したい1フレーム(これは非常に短い)
私が知っていることは?
まああまり、私はすべての日にとても簡単な例を探していますが、私は見つけることができるすべては、私が欲しいものに比べて非常に複雑なので、笑顔で受け入れられた任意のシンプルチュートリアル:)私が使用しているのはなぜ
DirectX?
私はOpenGLで成功を収めようとしましたが、here誰かが私にthisを使わなければならないと言ってきましたが、どうやって学ぶべきか分かりません... DXのバージョンは重要ではありません私、私はちょうどそれが可能な限り高速にする必要があります。..
だから、私は感謝とにかく、あなたは私を助けることを願っています:)DirectXで背景色を切り替える方法

UPDATE:STILL私が作る無回答

答えて

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つのフレームが赤だったことを確認できますか?私がやることは、元の数字に戻る前に 'Sleep(500)'を使うことですが、ここではどこに置く必要があるのか​​分かりません。 – Hido

+0

@Peewe [link](https://www.gamedev.net/topic/519829-changing-background-color-during-runtime/)を見てください –

+0

私がする必要があったのは、 'render_frameもう一度。ありがとうございました! – Hido

関連する問題