2017-04-25 5 views
0


Qu'est-ce que je veux?
Pour basculer le plus rapidement possible entre 2 couleurs d'arrière-plan (disons blanc et rouge) pour être plus précis, je veux que l'écran soit toujours blanc et 1 frame (cela a si court) soit rouge tous les 500 ms disons
Ce que je sais?
Eh bien pas grand-chose, je suis à la recherche toute la journée, par exemple simple mais tout ce que je peux trouver est si complexe à comparer à ce que je veux, de sorte que toute simple, tutoriel accepté avec un sourire :)
Pourquoi j'utilise DirectX?
J'ai essayé de le faire sur OpenGL sans succès et here quelqu'un m'a dit que je devrais utiliser this, mais je ne sais pas comment et ne pouvais pas trouver où apprendre ... La version de la DX n'est pas important de moi, je dois juste être aussi rapide que possible ..
Alors, je l'espère, vous me aider, merci quand même :)Comment basculer entre les couleurs d'arrière-plan dans DirectX

MISE à JOUR: TOUJOURS PAS dE RÉPONSE GOT

Répondre

1

Je fais une offre qui, je l'espère, peut vous aider. essayez ces étapes:

incluent les fichiers d'en-tête de fenêtres de base et le fichier d'en-tête de Direct3D:

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

comprennent le fichier Library Direct3D:

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

puis ajoutez ci-dessous les codes aussi:

// 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

Merci d'avoir répondu! mais, je vois juste un écran bleu, comment puis-je vérifier que 1 image était rouge? Habituellement, ce que je fais est d'utiliser 'Sleep (500)' avant de revenir au numéro d'origine mais ici je ne comprends pas où dois-je le mettre. – Hido

+0

@Peewe jeter un oeil à ce [lien] (https://www.gamedev.net/topic/519829-changing-background-color-during-runtime/) –

+0

Tout ce que je devais faire est d'appeler le 'render_frame 'une autre fois. Je vous remercie! – Hido