Bonsoir à tous.
Je suis actuellement en train de suivre ces excellents tutoriaux pour apprendre à faire un moteur 3D.
La ou j'en suis tout marche trés bien, j'ai à l'ecran ce qu'il faut qu'il s'afficher mais j'ai un probleme au niveau de la gestion des event clavier.
En effet, on a une classe Test qui contient un membre bool isRunning qui doit dire quand le renderer est activé ou pas. quand on appuit sur echap, il doit passer de true a false mais ca ne marche pas, des que je sort de la fonction qui gere les callback, il reprend sa valeur true.
Classe Test:
fonction avec la boucle d'execution:
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 class ALPHAGE_EXPORT Test : public Singleton<Test> { friend class Singleton<Test>; public: void run(); private: Test(); ~Test(); void initialize(); void makeWindow(); void render() const; static LRESULT CALLBACK GlobalWindowProc(HWND Hwnd, UINT Message, WPARAM WParam, LPARAM LParam); LRESULT CALLBACK WindowProc(HWND Hwnd, UINT Message, WPARAM WParam, LPARAM LParam); struct Vertex { float X, Y, Z; unsigned long color; }; HINSTANCE handleInstance; HWND handleWND; bool isRunning; Buffer<Vertex> vertexBuffer; VertexDeclarationPointer vertexDeclaration; };
Fonctions gerant les callback:
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 void Test::run() { initialize(); MSG message; while (isRunning) { if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&message); DispatchMessage(&message); } else { render(); } } }
Fonction d'initialisation:
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 LRESULT CALLBACK Test::GlobalWindowProc(HWND Hwnd, UINT Message, WPARAM WParam, LPARAM LParam) { return Test::getInstance().WindowProc(Hwnd, Message, WParam, LParam); } LRESULT CALLBACK Test::WindowProc(HWND Hwnd, UINT Message, WPARAM WParam, LPARAM LParam) { switch (Message) { case WM_DESTROY: isRunning = false; return 0; case WM_KEYDOWN: if (LOWORD(WParam) == VK_ESCAPE) { Logger::log() << "Je viens d'appuyer sur la touche Echape\n"; isRunning = false; Logger::log() << "isRunning = " << isRunning << "\n"; return 0; } } return DefWindowProc(Hwnd, Message, WParam, LParam); }
Je ne met rien d'autre car je ne pense pas que l'erreur provienne d'un autre endroit, mais la ca fait deux jours que je seche.
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 void Test::makeWindow() { const int width = 800; const int height = 600; const int left = (GetDeviceCaps(GetDC(NULL), HORZRES) - width) / 2; const int top = (GetDeviceCaps(GetDC(NULL), VERTRES) - height) / 2; WNDCLASSEX WindowClass; WindowClass.cbSize = sizeof(WNDCLASSEX); WindowClass.style = 0; WindowClass.lpfnWndProc = GlobalWindowProc; WindowClass.cbClsExtra = 0; WindowClass.cbWndExtra = 0; WindowClass.hInstance = handleInstance; WindowClass.hIcon = NULL; WindowClass.hCursor = LoadCursor(NULL, IDC_ARROW); WindowClass.hbrBackground = 0; WindowClass.lpszMenuName = NULL; WindowClass.lpszClassName = "AlphaGraphicEngine"; WindowClass.hIconSm = NULL; RegisterClassEx(&WindowClass); handleWND = CreateWindow("AlphaGraphicEngine", "Alpha Graphic Engine", WS_SYSMENU, left, top, width, height, NULL, NULL, handleInstance, NULL); Assert(handleWND != NULL); ShowWindow(handleWND, SW_NORMAL); }
Donc si quelqu'un voit ce que j'ai fait de travers ou pourrait juste me dire ce qui peut provoquer ce genre d'erreur?
Pour rappelle, c'est que je n'arrive pas a affecter la valeur false a la variable isRunning dans la fonction de gestion des callback. Le compilateur ne me met aucun message d'erreur, cela entrainne juste l'impossibilité d'arreter le programme avec la touche echap :s
Partager