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; }Un GRAND merci d'avance de votre aide!!
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; }
Bonne soirée.
Spartan03
Partager