Bonjour à tous,

Je suis en train (d'essayer) de faire un petit jeu vidéo du genre de Pong avec OpenGL. Mon "support" de dessin est une fenetre Windows (j'utilise l'ApiWin32, je programme en c++). J'aimerais que toute les fonctions "d'initialisation" (GetDC(); SetPixelFormat(); wglCreateContext(); wglMakeCurrent ()...) soient dans la procédure de la fenetre Windows mais en revanche, j'aimerais que le dessin sur la fenetre soit géré par un thread indépendant. Malheureusement, je rencontre quelques problèmes. En effet, lorsque je lance mon programme, rien ne s'affiche ou alors une image avec un mélange de tout ce qu'il y'a à l'écran clignote). Je ne comprends vraiment pas d'où vient ce problème!!!

Voici mon code

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
 
//La procédure de fenetre
 
static LRESULT CALLBACK procFenetreJeu(HWND fenetre, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HANDLE threadJeu;
    static DWORD idThreadJeu;
 
    static HDC hdc;
    static HGLRC hrc;
 
    static PIXELFORMATDESCRIPTOR pfd = {sizeof (PIXELFORMATDESCRIPTOR),1,
    PFD_SUPPORT_OPENGL | PFD_TYPE_RGBA | PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER,
    16,0, 0, 0, 0, 0, 0, 0, 0,	0, 0, 0, 0, 0,16,0, 0, 0, 0, 0, 0, 0};
 
    switch(message)
    {
        case WM_CREATE:
            SetWindowLong(fenetre,GWL_STYLE,WS_CAPTION|WS_SYSMENU|WS_SIZEBOX);
            ShowWindow(fenetre,SW_SHOWMAXIMIZED);
 
            hdc = GetDC ( fenetre );
            SetPixelFormat (hdc, ChoosePixelFormat(hdc, &pfd), &pfd);
            hrc = wglCreateContext (hdc);
            wglMakeCurrent (hdc, hrc);
 
            threadJeu = CreateThread(NULL,0,&PONG_thread_principal,(LPVOID)hdc,0,&idThreadJeu);
        break;
 
        case WM_SIZE:
            SuspendThread(threadJeu);
            glViewport (0,0,LOWORD (lParam),HIWORD (lParam));
            glMatrixMode (GL_PROJECTION);
            glLoadIdentity ();
            gluPerspective (45,(float)(LOWORD(lParam))/(float)(HIWORD(lParam)),1,100);
            ResumeThread(threadJeu);
        break;
 
        case WM_DESTROY:
            CloseHandle(threadJeu);
 
            wglMakeCurrent (NULL, NULL);
            wglDeleteContext (hrc);
            ReleaseDC (fenetre,hdc);
 
            PostQuitMessage(0);
        break;
 
        default:
            return DefWindowProc(fenetre,message,wParam,lParam);
    }
 
    return 0;
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 
//Le thread de dessin
 
DWORD WINAPI PONG_thread_principal(LPVOID lpParams)
{
    HDC hdc = (HDC)lpParams;
 
    while(1)
    {
        glClear (GL_COLOR_BUFFER_BIT);
        glMatrixMode (GL_MODELVIEW);
        glLoadIdentity ();
 
            /************************** DESSIN ********************************/
 
            gluLookAt (7,7,-10,0,0,0,0,1,0);
 
            glBegin (GL_QUADS);
                glColor3d(1,0,0);
                    glVertex3i (-1,-1,1);
                    glVertex3i (-1,1,1);
                    glVertex3i (1,1,1);
                    glVertex3i (1,-1,1);
                glColor3d(0,0,1);
                    glVertex3i (-1,-1,-1);
                    glVertex3i (-1,1,-1);
                    glVertex3i (1,1,-1);
                    glVertex3i (1,-1,-1);
                glColor3d(0,1,0);
                    glVertex3i (-1,1,-1);
                    glVertex3i (1,1,-1);
                    glVertex3i (1,1,1);
                    glVertex3i (-1,1,1);
                glColor3d(1,1,0);
                    glVertex3i (-1,-1,-1);
                    glVertex3i (1,-1,-1);
                    glVertex3i (1,-1,1);
                    glVertex3i (-1,-1,1);
                glColor3d(0,1,1);
                    glVertex3i (-1,-1,-1);
                    glVertex3i (-1,-1,1);
                    glVertex3i (-1,1,1);
                    glVertex3i (-1,1,-1);
                glColor3d(1,0,1);
                    glVertex3i (1,-1,-1);
                    glVertex3i (1,-1,1);
                    glVertex3i (1,1,1);
                    glVertex3i (1,1,-1);
                glEnd();
 
            /******************************************************************/
 
            SwapBuffers (hdc);
        Sleep(50);
    }
 
    return 0;
}
Un GRAND merci d'avance de votre aide!!

Bonne soirée.

Spartan03